Bunu yaptığımda dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)
Rapor Kimliği 18698 için aşağıdaki sonucu alıyorum:
Bu sorgu için:
SELECT *
FROM Reports_Documents
WHERE ReportID = 18698 option (recompile)
PK_Reports_Documents
Beklendiği gibi bir Kümelenmiş Dizin Araması yapan bir sorgu planı alıyorum .
Ancak beni şaşırtan şey, Tahmini Satır Sayısı için yanlış değerdir:
Göre bu :
Örnek sorgu WHERE yan tümcesi değeri bir histogram RANGE_HI_KEY değerine eşit olduğunda, SQL Server, eşittir satır sayısını belirlemek için histogramdaki EQ_ROWS sütununu kullanır
Bu benim de böyle olmasını beklediğim gibi, ancak gerçek hayatta böyle görünmüyor. Ayrıca RANGE_HI_KEY
, histogramda sağlanan show_statistics
ve aynı şekilde deneyimlenen diğer bazı değerleri denedim . Benim durumumda bu sorun, bazı sorguları birkaç dakika yürütme süresi ile sonuçlanan çok uygun olmayan yürütme planları kullanmak neden olurken ben bir sorgu ipucu ile 1 saniye içinde çalıştırabilirsiniz alabilirsiniz gibi görünüyor.
Sonuç olarak: Birisi bana neden EQ_ROWS
histogramdan Tahmini Satır Sayısı için kullanılmadığını ve yanlış tahminin nereden geldiğini açıklayabilir mi?
Biraz daha fazla (muhtemelen yararlı) bilgi:
- Otomatik oluşturma istatistikleri açık ve tüm istatistikler güncel.
- Sorgulanan tablonun yaklaşık 80 milyon satırı vardır.
PK_Reports_Documents
Bir kombinasyon PK oluşmaktadırReportID INT
veDocumentID CHAR(8)
Sorgu, tümü ReportID
tablodan + başka sütunlar içeren toplam 5 farklı istatistik nesnesi yüklüyor gibi görünüyor . Hepsi taze güncellendi. RANGE_HI_KEY
Aşağıdaki tabloda histogramdaki en yüksek üst sınır sütun değeri verilmiştir.
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| name | stats_id | auto_created | user_created | Leading column Type | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| PK_Reports_Documents | 1 | 0 | 0 | Stationary | 18722 | 0 | 2228,526 | 0 | 1 |
| _dta_index_Reports_Documents_42_1629248859__K1_K63_K14_K13_K22_K23_72_6 | 62 | 0 | 0 | Stationary | 18698 | 0 | 2228,526 | 0 | 1 |
| _dta_stat_1629248859_1_1_59 | 76 | 0 | 1 | Stationary | 18686 | 50,56393 | 1 | 0 | 13397,04 |
| _dta_stat_1629248859_1_22_14_18_12_6 | 95 | 0 | 1 | Stationary | 18698 | 0 | 2228,526 | 0 | 1 |
| _dta_stat_1629248859_1_7_14_4_23_62 | 96 | 0 | 1 | Stationary | 18698 | 56,63327 | 21641,5 | 0 | 14526,44 |
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
sp_updatestats
istatistikleri güncellemek için her gece çalışması planlanıyor.
_dta_
istatistikleri oluşturmadım , DB'ye ilk bakışımı aldığımdan beri oradaydılar. Önerileri kullanarak olsa da bu tür olumsuz etkileri olabilir bilmiyordum ...