Filtre "büyük" veya "küçük" olduğunda, satırları tahmin etme formülü biraz saçma olur, ancak bu, ulaşabileceğiniz bir sayıdır.
Sayılar
Adım 193'ü kullanarak, ilgili sayılar şunlardır:
RANGE_ROWS = 6624
EQ_ROWS = 16
AVG_RANGE_ROWS = 16.1956
Önceki adımdan RANGE_HI_KEY = 1999-10-13 10: 47: 38.550
Geçerli adımdan RANGE_HI_KEY = 1999-10-13 10: 51: 19.317
WHERE maddesinden değer = 1999-10-13 10: 48: 38.550
Formül
1) İki aralıklı hi tuşu arasındaki ms'yi bulun
SELECT DATEDIFF (ms, '1999-10-13 10:47:38.550', '1999-10-13 10:51:19.317')
Sonuç 220767 ms'dir.
2) Satır sayısını ayarlayın
Milisaniye başına satır bulmamız gerekiyor, ancak yapmadan önce AVG_RANGE_ROWS değerini RANGE_ROWS'tan çıkarmamız gerekiyor:
6624-16.1956 = 6607.8044 satır
3) Ayarlanan satır sayısı ile ms başına satır sayısını hesaplayın:
6607.8044 satır / 220767 ms = ms başına .0299311 satır
4) WHERE yan tümcesindeki değer ile geçerli RANGE_HI_KEY adımı arasındaki ms'yi hesaplayın
SELECT DATEDIFF (ms, '1999-10-13 10:48:38.550', '1999-10-13 10:51:19.317')
Bu bize 160767 ms verir.
5) Bu adımdaki satırları saniyedeki satır sayısına göre hesaplayın:
.0299311 satır / ms * 160767 ms = 4811.9332 satır
6) AVG_RANGE_ROWS'u daha önce nasıl çıkardığımızı hatırlıyor musunuz? Onları geri ekleme zamanı. Artık saniyedeki satır sayısı ile ilgili sayıları hesapladığımızdan EQ_ROWS'u da güvenle ekleyebiliriz:
4811.9332 + 16.1956 + 16 = 4844.1288
Sonuç olarak, bu bizim 4844.13 tahminimizdir.
Formülü test etme
AVG_RANGE_ROWS'un neden ms başına satır hesaplanmadan önce çıkarıldığına dair herhangi bir makale veya blog yayını bulamadım. Ben idi anlamıyla - onlar tahmini, ama sadece son milisaniye değerleriyle, onaylamak mümkün.
WideWorldImporters veritabanını kullanarak, bazı artımlı testler yaptım ve satır tahminlerindeki azalmanın adımın sonuna kadar doğrusal olduğunu gördüm, burada 1x AVG_RANGE_ROWS aniden hesaplandı.
İşte benim örnek sorgu:
SELECT PickingCompletedWhen
FROM Sales.Orders
WHERE PickingCompletedWhen >= '2016-05-24 11:00:01.000000'
PickingCompletedWist istatistiklerini güncelledikten sonra histogramı aldım:
DBCC SHOW_STATISTICS([sales.orders], '_WA_Sys_0000000E_44CA3770')
RANGE_HI_KEY'e yaklaştıkça tahmini satırların nasıl azaldığını görmek için adım boyunca örnekleri topladım. Düşüş doğrusaldır, ancak AVG_RANGE_ROWS değerine eşit sayıda satır sadece trendin bir parçası değil gibi davranır ... siz RANGE_HI_KEY'e çarpana ve aniden tahsil edilmemiş borç gibi düşene kadar. Bunu örnek verilerde, özellikle grafikte görebilirsiniz.
Biz RANGE_HI_KEY ve sonra son AVG_RANGE_ROWS yığın aniden çıkarılır BOOM vurmak kadar satırlarda sürekli düşüş dikkat edin. Bir grafiği görmek de kolaydır.
Özetle, AVG_RANGE_ROWS'un garip muamelesi, satır tahminlerini hesaplamayı daha karmaşık hale getirir, ancak CE'nin ne yaptığını her zaman uzlaştırabilirsiniz.
Üstel Geri Çekilme ne olacak?
Üstel Geri Çekme, yeni (SQL Server 2014'ten itibaren) Kardinalite Tahmincisi'nin birden çok tek sütunlu istatistik kullanırken daha iyi tahminler elde etmek için kullandığı yöntemdir. Bu soru yaklaşık tek sütunlu bir istatistik olduğundan EB formülünü içermez.