istatistikler güncel, ancak tahmin yanlış


12

Bunu yaptığımda dbcc show_statistics ('Reports_Documents', PK_Reports_Documents)Rapor Kimliği 18698 için aşağıdaki sonucu alıyorum:

resim açıklamasını buraya girin

Bu sorgu için:

SELECT * 
FROM Reports_Documents 
WHERE ReportID = 18698 option (recompile)

PK_Reports_DocumentsBeklendiğ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:

resim açıklamasını buraya girin

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_statisticsve 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_ROWShistogramdan 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_DocumentsBir kombinasyon PK oluşmaktadır ReportID INTveDocumentID CHAR(8)

Sorgu, tümü ReportIDtablodan + 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_KEYAş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.

Yanıtlar:


10

Bunun basit bir çözümü var:

Tüm _dta_...istatistikleri bırakın ve DTA önerilerini körü körüne uygulamayı bırakın.

Daha fazla bilgi

Sorun, söz konusu sütun için birden çok istatistik kümesinin bulunmasıydı. Ek dtaistatistikler, verileri örnekleyerek (bir dizinle ilişkilendirilmeyen istatistikler için varsayılan davranış) oluşturuldu.

Genellikle örneklenmiş istatistiklerde olduğu gibi, sonuçta elde edilen histogramlar, kayıtsız verilerin tamamını kapsamamıştır. Sorudaki sorgu, histogramın dışında bir değer seçerek 1 satırlık bir tahminde bulundu.

Aynı sütun için birden çok istatistik kümesi bulunduğunda sorgu iyileştiricisinin tam davranışı tam olarak belgelenmemiştir. Örneklenenlere göre 'tam tarama' istatistiklerini tercih etme eğilimindedir, ancak daha yeni güncellenmiş istatistikleri daha eski olanlara tercih eder.


Bu gerçekten işe yarıyor. Ancak _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 ...
user1151923
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.