SQL Server neden bileşik sütun istatistik histogramları yapmıyor?


10

SQL Server'ın "çok sütunlu istatistik" adı verilen bir şeyi vardır, ancak bunun ne anlama geleceğini düşünmez.

Aşağıdaki örnek tabloya bir göz atalım:

CREATE TABLE BadStatistics 
(
    IsArchived BIT NOT NULL,
    Id INT NOT NULL IDENTITY PRIMARY KEY,
    Mystery VARCHAR(200) NOT NULL
);

CREATE NONCLUSTERED INDEX BadIndex 
    ON BadStatistics (IsArchived, Mystery);

Bununla, sahip olduğumuz iki dizinde iki istatistik oluşturuluyor:

BadIndex için istatistikler:

+--------------+----------------+-------------------------+
| All density  | Average Length | Columns                 |
+--------------+----------------+-------------------------+
| 0.5          | 1              | IsArchived              |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37             | IsArchived, Mystery     |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41             | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0            | 0          | 24398   | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 216602  | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

Kümelenmiş dizin için istatistikler:

+--------------+----------------+---------+
| All density  | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4              | Id      |
+--------------+----------------+---------+

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1            | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+
| 240999       | 240997     | 1       | 240997              | 1              |
+--------------+------------+---------+---------------------+----------------+
| 241000       | 0          | 1       | 0                   | 1              |
+--------------+------------+---------+---------------------+----------------+

(Tabloyu, satırların onda birinin arşivlenmediği rastgele örnek verilerle doldurdum. Daha sonra tam bir tarama istatistikleri güncellemesi gerçekleştirdim.)

İki sütunlu istatistiklerin histogramı neden yalnızca bir sütun kullanıyor? Ben sayısız insanlar bu konuda yazdım biliyor mu , ama mantık nedir? Bu durumda, tüm histogramı çok daha az kullanışlı hale getirir, çünkü ilk sütun sadece iki değere sahiptir. İstatistikler neden bu şekilde keyfi olarak kısıtlanıyor?

Lütfen bu sorunun tamamen farklı bir canavar olan çok boyutlu histogramlardan bahsetmediğini unutmayın. Tek boyutlu histogramlar ile ilgilidir, tek boyut ilgili, birden çok sütunu içeren tuplelerdir.

Yanıtlar:


8

Arka fon

Geçerli SQL Server modeli yalnızca tek sütunlu histogramları ve çok sütunlu yoğunluk bilgilerini kullanır. Tek sütun histogramlar uygun temel fonksiyonlar örn için seçicilik tahmin etmek için kullanılır a = 1ya da b > 50. Birden çok tahmin içeren bir sorgu, tahmini genel seçicilik üretmek için tek tek seçimleri (varsayımlarla) birleştirir.

Örnek olarak, Kardinalite Tahmini: Yoğunluk İstatistiklerini Birleştirme makaleme bakın

Çok sütunlu yoğunluk ayrıca, çoklu eşitlik tahminleri için zayıf korelasyon bilgisi sağlayarak ve kümelenmeler için kardinaliteleri gruplandırarak modeli bilgilendirir.

Dizinlerle ilişkili istatistikler, bu modele fırsatçı bir eklentidir: Motor, bir dizin oluştururken de istatistikleri toplayabilir (normalde tam tarama). SQL Server, diğer tuşlar için otomatik olarak bir ön sütun histogramı ve yoğunluk bilgisi oluşturur.

Bir indeks içerisinde yönlendirici olmayan kolonlar için histogramlar sorgu işlemci tarafından otomatik olarak talep üzerine inşa veya önceden kullanılarak edilebilir sp_createstatsile @indexonly(diğerleri arasında) seçeneği.

Çok sütunlu histogramlar

Tek sütunlu istatistikleri birleştirirken yapılan varsayımlar (yukarıdaki gibi) verilerin gerçekliğini yeterince iyi modelleyebilir veya oluşturmayabilir. Birçok durumda, mevcut seçenekler (üstel geri çekilme, bağımsızlık, minimum seçicilik) 'yeterince iyi' bir tahmin üretir.

Ayrıca, soru örneğindeki gibi düşük kardinaliteye sahip sütun dizinlerine doğal bir çözüm olarak filtrelenmiş istatistikleri (ve dizinleri) da var. Bunları mantıksal aşırılığa götürmek bizi sorunun olmadığı çok boyutlu istatistiklere yaklaştırıyor.

Mevcut modelleme seçenekleri uygun bir tahmin sağlayamadığında, çok sütunlu bir istatistik histogram bazı durumlarda uygun indeks tahminleri için gerçekten daha iyi bir seçicilik tahmini verebilir. Farklı veri türlerini farklı sütunlarda birleştirmek konusunda bazı zorluklar vardır, ancak aşılmaz bir şey yoktur.

Ayrıca, dizin anahtarlarının her seviyesi için bir histograma ihtiyacımız olurdu (en iyi sonuçlar için); bu nedenle bir indeks için (a, b, c), histogramlar (a, b)ve (a, b, c)tek (a)başına geçerli tek sütunlu histogramın yanı sıra .

Eski istatistikleri saptamak için kullanılan mekanizmanın, etkilenen çok sütunlu histogramları korumak için değiştirilmesi gerekir. Bu histogramlar muhtemelen tek sütunlu istatistiklerden daha sık yeniden oluşturulacaktır, çünkü daha fazla sütundaki değişiklikler onları etkilemektedir.

Tüm bunlar boyut, karmaşıklık ve bakım yükü ekler.

Çok sütunlu istatistikler, çok sayıda sütuna başvuruda bulunan, dikkatlice oluşturulmuş bir hesaplanmış sütun üzerinde oluşturulan bir istatistik kullanılarak simüle edilebilir (sınırlı ölçüde). Sorgunun, bu istatistikten yararlanmak için hesaplanan sütuna (veya temel formül için tam bir metin eşleşmesine) sahip olması gerekir. Muhtemelen bu yaklaşımın pratik olduğu çok sınırlı durumlar vardır. Bununla birlikte, otomatik çok sütunlu histogramlarla aynı uygulama sorunlarından bazılarına sahiptir.

Nihayetinde, SQL Server'ın neden çok sütunlu istatistikleri desteklemediğinden emin olabilecek tek kişi tasarımcıların kendileri olacaktır. Geniş uygulanabilirliğe sahip bu alanda ürün geliştirme için güçlü bir durum oluşturabileceğinizi düşünüyorsanız, bunu Connect'te veya normal destek kanalınızdan önerebilirsiniz .

dipnot

Bu durumda, tüm histogramı çok daha az kullanışlı hale getirir, çünkü ilk sütun sadece iki değere sahiptir

İstatistikler inşa edildiğinde, 24398 satır vardı: histogram hala lider sütundaki değerlerin dağılımı hakkında yararlı bilgiler sağlar IsArchivedidi yanlış ve is oldu 216.602 satır gerçek .

Buna ek olarak, istatistik bir nesne (1 / 0,5) = 2 farklı değerler için orada söyler IsArchived(1 / 4.149378E-06) ~ için = 241000 ayrı değer, (IsArchived, Mystery)37 bayt, ortalama satır büyüklüğü ve orada aynı frekans için (IsArchived, Mystery, Id)olan Satır başına 4 ekstra bayt.

Bunların hepsi, birden fazla tahmin içeren sorgularda (belirtildiği gibi) bir seçicilik tahmini oluşturmak için diğer sütunlar hakkında istatistiksel bilgilerle birleştirilebilen genel amaçlı iyi bilgilerdir.

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.