Dizin oluşturmak yerine İSTATİSTİK oluşturmak ne zaman daha iyidir?


38

Neler STATISTICS olduğu hakkında çok fazla bilgi buldum : nasıl tutuldukları, sorgulardan veya dizinlerden manuel veya otomatik olarak nasıl oluşturulabilecekleri vb. Ancak, ne zaman ile ilgili herhangi bir rehberlik veya "en iyi uygulamalar" bilgisi bulamadım .Onları oluşturmak için: Hangi durumlar bir Endekse göre elle oluşturulmuş bir STATISTICS nesnesinden daha fazla yararlanır. Bölümlenmiş tablolardaki sorgulara yardımcı olan filtrelenmiş istatistikler oluşturduğumu gördüm (çünkü dizinler için oluşturulan istatistikler tüm tabloyu kapsar ve bölüm başına değil - brillaint!); Bir endeksin detayına ihtiyaç duymamak, endeksi sürdürmenin veya blokaj / kilitlenme şansını arttırmanın maliyetine değmez.

@JonathanFite, yorumunda, dizinler ve istatistikler arasındaki farktan bahsetti:

Dizinler, SQL'in tablodan farklı şekilde sıralanmış aramalar oluşturarak verileri daha hızlı bulmasına yardımcı olur. İstatistikler, SQL'in sorguyu karşılamak için ne kadar bellek / çaba gerekeceğini belirlemesine yardımcı olur.

Bu harika bir bilgi, çünkü sorumu netleştirmeme yardımcı oluyor:

Bu nasıl bilerek (veya başka herhangi bir teknik bilgi vermez neyi s ve nasıl davranışlar ve doğası ile ilgili s STATISTICS) yardımıyla belirlemek zaman seçim için CREATE STATISTICSüzerinde CREATE INDEXilgili yaratacak bir Index oluştururken özellikle, STATISTICSnesneyi? Dizine sahip olmamak ve sadece İSTATİSTİK bilgisine sahip olmakla hangi senaryo daha iyi sunulacak ?

Mümkünse, STATISTICSnesnenin bir karakterden daha uygun olduğu bir senaryo için çalışan bir örneğe sahip olmak süper yararlı olacaktır INDEX.


Görsel bir öğrenen / düşünür olduğum için , yan yana olan STATISTICSve arasındaki farkları INDEX, yan yana, ne zaman STATISTICSdaha iyi bir seçim yapılacağının belirlenmesine yardımcı olacak bir araç olarak görmenin yardımcı olabileceğini düşündüm .

Thingy           PROs                             CONs
-------          ----------                       -------------------
INDEX            * Can help sorts.                * Takes up space.
                 * Contains data (can             * Needs to be maintained (extra I/O).
                   "cover" a query).              * More chances for blocking / dead-locks.

STATISTICS       * Takes up very little space.    * Cannot help sorts.
                 * Lighter maintenance / won't    * Cannot "cover" queries.
                   slow down DML operations.
                 * Does not increase chances
                   of blocking / dead-locks.

Aşağıdakiler, bu soruyu soran, hatta aynı soruyu soran, fakat cevaplanmayan bazı kaynaklar.

SQL Server Dizini - İstatistik

SQL Server İstatistik Soruları Sormak İçin Çok Utangaç Olduk

İstatistik. Çok noktalı virgül histogramları mümkün mü?

** Açık olmak gerekirse, bunun için bir cevabım yok ve aslında birkaç kişinin interweb'lerde garip bir şekilde eksik olan bilgiyi sağlaması için birkaç kişiden geri bildirim almak istiyorum.


1
Dizinler, SQL'in tablodan farklı şekilde sıralanmış aramalar oluşturarak verileri daha hızlı bulmasına yardımcı olur. İstatistikler, SQL'in sorguyu karşılamak için ne kadar bellek / çaba gerekeceğini belirlemesine yardımcı olur.
Jonathan Fite

@JonathanFite Bu yorum için teşekkür ederiz. Benim soruma dahil ettim :).
Solomon Rutzky

@ JonathanFite'nin yorumundan sonra, Ad hoc sistemlerinde / tablolarında / sorgu modellerinde performansı artırmak için en iyisi gibi gözükse de, Endeksler öngörülebilir sorgu modellerinde daha iyidir. Bunu bir ifadeden çok bir soru olarak kastettim.
Dave,

Yanıtlar:


19

Sorgu etrafında döner - Ne zaman sadece istatistik oluşturmak vs indeks (istatistik oluşturmak) oluşturmak için iyi bir şeydir.

Sql sunucum dahili notlarımdan (SQLSkills sınıfı - IE1 ve IE2) ve SQL Server dahili kitabımdan , benim sınırlı anlayışım:

SQL Server istatistikleri, dizin anahtarı değerleri ve normal sütun değerleri hakkında hayati bilgiler içeren sistem nesnelerinden başka bir şey değildir.

SQL Server, "yeterince iyi" bir yürütme planını mümkün olan en hızlı şekilde seçmek için maliyet tabanlı bir model kullanır. Karibilite tahmini (sorgu uygulamasının her aşamasında işlenecek satır sayısını tahmin etme), başlangıç ​​stratejisini, bellek verme gereksinimini, çalışan iş parçacığı seçimini ve verilere erişirken endeks seçimini etkileyen başlangıçta sorgu optimizasyonunda en önemli faktördür .

SQL Server, büyük bir sayı olduğunu tahmin ettiğinde kümelenmemiş dizinleri kullanmaz. ANAHTAR veya RID döngü işlemlerinin yapılması gerekeceğinden, bu tür tahminlerde yardımcı olacak indeksler (ve sütunlar) üzerindeki istatistikleri tutar.

İstatistiklerle ilgili 2 önemli şey var:

  1. Histogram, SADECE en soldaki istatistik (dizin) sütunu için veri dağılımı hakkında bilgi depolar. Ayrıca, anahtar değerlerin çoklu sütun yoğunluğu hakkında bilgi depolar. Dolayısıyla, esasen, histogram, sadece en soldaki istatistik sütunu için veri dağılımını saklar.

  2. SQL Server, tablo boyutuna bakılmaksızın histogramda en fazla 200 adım tutacaktır. Her bir histogram adımının kapsadığı aralıklar, tablo büyüdükçe artar, bu da büyük tablolar için "daha az doğru" istatistiklere yol açar.

    İndeks seçiciliğinin, yoğunluk ile ters orantılı olan bir metrik olduğunu unutmayın; yani bir sütunda ne kadar benzersiz değerler varsa, seçiciliği de o kadar yüksek olur.

Belirli sorgular çok sık çalışmadığında, bir dizin yerine sütun düzeyinde istatistikler oluşturmayı seçebilirsiniz. Sütun düzeyi istatistikleri, Sorgu Doktorunun daha iyi yürütme planları bulmasına yardımcı olur; bu yürütme planları, içerdiği dizin taramaları nedeniyle düşüktür. Aynı zamanda, istatistikler veri değiştirme işlemleri sırasında bir ek yük getirmez ve dizin bakımının önlenmesine yardımcı olurlar. Bu yaklaşım yalnızca nadiren yürütülen sorgular için işe yarar.

Bakın:

Not: Paul White veya Aaron Bertrand gibi biri , iyi sorunuza daha fazla renk sağlamak için ses çıkarabilir .


"SQL Server, büyük bir KEY veya RID döngü işlemi işleminin gerekli olacağını tahmin ettiğinde kümelenmemiş dizinleri kullanmayacak" Peki, KG, dizinden bağımsız olarak dizine dayalı bir istatistik nesnesini kullanabilir mi? Eğer endeks optimal değilse, fakat baştaki sütun sorguda ise, istatistikler hala geçerli olur. Yani kullanılacaklar mı? Veya bu bilgi, bir endeksin kullanılmayacağı durumlar olabileceği anlamına mı geliyor, ancak istatistikler hala değere sahip olduklarından, indeksi oluşturmak için gerçek bir neden olmadığından, sadece istatistikleri mi yapıyorsunuz?
Solomon Rutzky

8

Veri miktarını sınırlayabilmeniz / alanlara bağlı olarak hızlı bir şekilde doğru verilere ulaşabilmeniz gerektiğinde bir endekse ihtiyacınız olduğunu söyleyebilirim.

İşlemleri mümkün olan en iyi şekilde yapabilmek için verilerin yapısını anlamak için iyileştiriciye ihtiyaç duyduğunuzda istatistiklere ihtiyacınız vardır.

Ne farkettim ki, filtrelenmiş istatistikler, verilerinizde planı ağır şekilde etkileyen çarpıklıklar olduğunda, örneğin yığın taşması durumlarında az sayıda kullanıcının çok sayıda mesajı olması nedeniyle yardımcı olur, bu nedenle kullanıcı başına yalnızca ortalama yayınların kullanılması gerçekten en iyi tahmin değildir. Böylece, kullanıcı adına göre userId'de filtrelenmiş bir istatistik oluşturabilir ve ardından SQL Server, bu kullanıcı adı sorguda olduğunda, bunun alacağı kullanıcı kimliği olduğunu ve bunun ne olduğunu anlayabilmesi gerektiğini bilmelidir. Gönderiler tablosundaki dizine eklenmiş alan, bu kimliğe sahip çok sayıda satır içerecektir, çünkü histogram oradadır. Ortalamalar ile bunu yapmak mümkün değildir.


1
Merhabalar ve cevap verdiğiniz için teşekkürler. Öyleyse, optimize edicinin verinin doğasını daha iyi anlamasını ve ne zaman bu verileri sınırlandırmamasını veya daha hızlı elde etmeyi istememesini veya sorguyu "kapsamasına" ihtiyaç duymamasını ne zaman isterim / isterdim ? Filtre uygulanmış dizin örneğiniz için aynı. Ne demek istediğinizi ortalamalardan parçalara ayırma açısından anladım, ancak neden filtre uygulanmış istatistikler aynı alanlardaki filtre uygulanmış bir dizinden daha iyi olsun? Bu almaya çalıştığım ayrım.
Solomon Rutzky

Örnekte olduğu gibi, orada olmadığı için kullanıcı adında gönderiler tablosuna filtre uygulanmış bir dizin oluşturamazsınız. Kullanıcı kimliğine göre oluşturabilirsiniz, ancak bu, maddede değil.
James Z,

Fakat olmasa UserIDbile JOIN durumunda olmaz WHEREmıydı? Ve bu, filtrelenmiş bir Dizini almak için yeterince iyi olmaz mıydı?
Solomon Rutzky

@srutzky Belki de en güncel sürümlerde daha muhtemeldir, ancak genel olarak buna güvenmem ... çoğu durumda, yüklemlerin tam olarak eşleşmesi gerekir. Bunu düzelttiler ancak bir noktada filtre uygulanmış bir indeks WHERE BitColumn = 0basit bir sorgu için seçilmeyeceğini unuttum WHERE BitColumn <> 1. (Ve net olmak gerekirse, biraz sütun null değildi.) Ben gibi benzer vakalar vardı düşünüyorum IntColumn > 10uymayan IntColumn >= 11.
Aaron Bertrand

Filtrelenmiş dizinler, birinin bir daha kullanması durumunda filtrelenmiş dizinin artık uygun olmadığına dair bir şans varsa, kullanılamaz. Filtrelenmiş bir dizin kullanabilecek hiçbir birleşme olduğunu düşünemiyorum. Değişkenler bile kullanılamaz çünkü bir dahaki sefere değer uygun olmayan bir şey olabilir.
James Z

4

Itzik Ben-Gan'dan 70-461 Eğitim kitabı

El ile istatistik oluşturmak için yalnızca birkaç neden olabilir. Bir örnek, bir sorgu yüklemesinde sütunlar arası ilişkilere sahip birden çok sütun içerdiğinde; Birden çok sütundaki istatistikler, sorgu planını iyileştirmeye yardımcı olabilir. Birden çok sütundaki istatistikler, tek sütun istatistiklerinde bulunmayan sütunlar arası yoğunlukları içerir. Ancak, sütunlar zaten aynı dizindeyse, çok noktalı virgül istatistik nesnesi zaten var, bu nedenle el ile ek bir tane oluşturmamanız gerekir.


Bunu gönderdiğiniz için teşekkür ederiz. Bu, sorumun bir bölümünü cevaplıyor ama yine de şu soruyu açık bırakıyor: Çok sütunlu istatistiklere ihtiyacım olursa, neden İSTATİSTİK artı sorguyu daha da yardımcı olabilecek ek bilgileri de içerecek olan Dizin yerine yalnızca İSTATİSTİK oluşturabilirim ( ler)?
Solomon Rutzky

1
Bence Kin'in açıklaması, neyin peşinde olduğunuzu daha fazla açıklayacaktır. Belki de sık sık takılan ancak nadiren sorgulanan bir yığın?
Kentaro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.