İstatistik. Çok sütunlu histogramlar mümkün müdür?


13

Yüksek yoğunluklu iki sütunun olduğu bir durum düşünüyorum ama bu sütunlar bağımsız değil.

Tanım

İşte test amacıyla oluşturduğum tablonun tanımı.

CREATE TABLE [dbo].[StatsTest](
    [col1] [int] NOT NULL,  --can take values 1 and 2 only
    [col2] [int] NOT NULL,  --can take integer values from 1 to 4 only
    [col3] [int] NOT NULL,  --integer. it has not relevance just to ensure that each row is different
    [col4]  AS ((10)*[col1]+[col2])  --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4 
) ON [PRIMARY]

Veri

Deney verileri aşağıdaki gibidir

col1    col2    col3    col4
1       1       1       11
1       2       2       12
1       2       3       12
1       3       4       13
1       3       5       13
1       3       6       13
1       4       7       14
1       4       8       14
1       4       9       14
1       4       10      14
2       1       11      21
2       1       12      21
2       1       13      21
2       1       14      21
2       2       15      22
2       2       16      22
2       2       17      22
2       3       18      23
2       3       19      23
2       4       20      24

Adım 1: Col1'e göre filtreleme

SELECT * FROM StatsTest WHERE col1=1

Beklendiği gibi, Sorgu Optimize Edici tam satır sayısını tahmin eder. Gerçek Satır Sayısı = 10 ve Tahmini Satır Sayısı = 10

Adım 2: Col2'ye göre filtreleme

SELECT * FROM StatsTest WHERE col2=1

Yine mükemmel bir tahminimiz var.

Gerçek Satır Sayısı = 5 ve Tahmini Satır Sayısı = 5

Adım 3: Col1 ve Col2'ye göre filtreleme

SELECT * FROM StatsTest WHERE col1=1 AND col2=1

Burada tahmin, gerçek satır sayısına yakın olmaktan çok uzaktır. Gerçek Satır Sayısı = 1 ve Tahmini Satır Sayısı = 3.53553

Sorun, sorgu çözümleyicisi implicity sorgusu col1 ve col2 bağımsız olduğunu varsayar ama değil.

Adım 4: Col4'e göre filtreleme

SELECT * FROM StatsTest WHERE col4 = 11

Süt4 hesaplanmış bir sütun ve şekline göre de tanımlanmıştır, çünkü Aşama 3'te terimi aynı sonuçları elde etmek için Süt4 = 11 tarafından filtre col1 = 1 ve col2 = 1 eşdeğerdir Süt4 = 11 Ancak burada, beklendiği gibi tahmin mükemmel.

Gerçek Satır Sayısı = 1 ve Tahmini Satır Sayısı = 1

Sonuç / Soru

Artificial Bu yapay ve yetersiz çözüm, bağımsız olmayan iki veya daha fazla sütunla filtreleme yaparken doğru tahminler elde etmek için mevcut tek seçenek midir? ¿Hesaplanan sütun ve hesaplanan sütuna göre filtre gerçek hassasiyet elde etmek için kesin olarak gerekli mi?

Örnek sqlfiddle


Neden col1 / 2 üzerinde bazı dizinler oluşturmuyorsunuz?
LowlyDBA

Aslında yaptım ama buraya dahil etmedim çünkü işe yaramadı. Histogram için sadece ilk sütun dikkate alınır ve yoğunluk, dağılımlarını değil, yalnızca farklı sayıda değeri dikkate alır
JGA

Yanıtlar:


15

Çok sütunlu histogramlar mümkün müdür?

Gerçek çok boyutlu histogramlar değil, hayır.

Bu yapay ve yetersiz çözüm, bağımsız olmayan iki veya daha fazla sütunla filtreleme ile ilgili doğru tahminler elde etmek için mevcut tek seçenek midir?

SQL Server "çok sütunlu" istatistikleri destekler , ancak ilk adlandırılan sütundaki bir histograma ek olarak yalnızca ortalama yoğunluk (korelasyon) bilgilerini yakalarlar. Bunlar sadece eşitlik karşılaştırmaları için kullanışlıdır.

Ortalama yoğunluk bilgileri herhangi bir ayrıntıyı yakalamaz, bu nedenle iki sütunlu bir istatistik nesnesindeki herhangi bir değer çifti için aynı seçiciliği alırsınız . Bazı durumlarda, çok sütunlu istatistikler yeterince iyi ve hiçbir şeyden daha iyi olabilir. Çok sütunlu istatistikler, çok sütunlu dizinler üzerinde otomatik olarak oluşturulur.

SQL Server sürümüne bağlı olarak, filtrelenmiş dizinleri ve filtrelenmiş istatistikleri de kullanabilirsiniz :

-- Filtered statistics example
CREATE STATISTICS stats_StatsTest_col2_col1_eq_1
ON dbo.StatsTest (col2)
WHERE col1 = 1;

CREATE STATISTICS stats_StatsTest_col2_col1_eq_2
ON dbo.StatsTest (col2)
WHERE col1 = 2;

Veya dizin oluşturulmuş bir görünüm oluşturabilirsiniz (kendi dizinlerini ve istatistiklerini destekleyebilir). İndekslenmiş görünümler, tablolar arası korelasyonlar için az kullanılan bir özellik olan DATE_CORRELATION_OPTIMIZATIONveritabanı sorununun arkasındaki mekanizmadır , ancak sorunun özü için geçerlidir.

Hesaplanan sütun ve hesaplanan sütuna göre filtre gerçek hassasiyet elde etmek için kesinlikle gerekli mi?

Tek yöntem bu değil. Daha önce bahsedilenlere ek olarak, hesaplanan sütunun tam metinsel tanımını da belirtebilirsiniz ve optimize edici genellikle hesaplanan sütundaki istatistiklerle eşleşir.

Çok sütunlu korelasyonlar hakkında yapılan varsayımları değiştiren iz bayrakları da vardır. Ayrıca, SQL Server 2014'teki varsayılan korelasyon varsayımı (yeni kardinalite tahmincisi etkinken) Bağımsızlıktan Üstel Geri Çekime ( burada ve burada daha fazla ayrıntı ) değiştirilmiştir. Sonuçta, bu sadece farklı bir varsayımdır. Birçok durumda daha iyi, diğerlerinde daha kötü olacaktır.

İyi bir uygulama planı elde etmek için her zaman kardinalite tahmininde kesin hassasiyet gerekli değildir. Farklı parametre değerleri için yeniden kullanılabilen bir plan oluşturmak ile belirli bir yürütme için en uygun olan ancak yeniden kullanılmayan bir plan oluşturmak arasında her zaman bir denge vardır.

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.