เมื่อฉันฉันจะdbcc show_statistics ('Reports_Documents', PK_Reports_Documents)
ได้รับผลลัพธ์ต่อไปนี้สำหรับรหัสรายงาน 18698:
สำหรับการค้นหานี้:
SELECT *
FROM Reports_Documents
WHERE ReportID = 18698 option (recompile)
ฉันได้รับแผนคิวรีที่ทำให้ดัชนีเป็นกลุ่มค้นหาPK_Reports_Documents
ตามที่คาดไว้
แต่สิ่งที่ทำให้ฉันยุ่งเหยิงคือค่าที่ไม่ถูกต้องสำหรับจำนวนแถวโดยประมาณ:
ตามนี้ :
เมื่อแบบสอบถามตัวอย่างค่า WHERE อนุประโยคเท่ากับค่าฮิสโตแกรม RANGE_HI_KEY ค่า SQL Server จะใช้คอลัมน์ EQ_ROWS ในฮิสโตแกรมเพื่อกำหนดจำนวนแถวที่เท่ากับ
นี่เป็นวิธีที่ฉันคาดหวังไว้ว่าจะเป็นอย่างไรก็ตามในชีวิตจริงดูเหมือนจะไม่เป็นเช่นนั้น ฉันยังลองRANGE_HI_KEY
ค่าอื่น ๆที่มีอยู่ในฮิสโตแกรมที่จัดทำโดยshow_statistics
และประสบการณ์เดียวกัน ปัญหานี้ในกรณีของฉันดูเหมือนว่าจะทำให้แบบสอบถามบางอย่างใช้แผนการดำเนินการที่ไม่เหมาะสมมากทำให้เวลาดำเนินการไม่กี่นาทีในขณะที่ฉันสามารถเรียกใช้ใน 1 วินาทีพร้อมคำใบ้แบบสอบถาม
สรุป: มีคนอธิบายได้ไหมว่าทำไมEQ_ROWS
ไม่ใช้ฮิสโตแกรมมาคำนวณหาจำนวนแถวและการประมาณการที่ไม่ถูกต้องมาจากไหน
ข้อมูลอีกเล็กน้อย (อาจมีประโยชน์):
- เปิดใช้งานการสร้างสถิติอัตโนมัติและสถิติทั้งหมดเป็นข้อมูลล่าสุด
- ตารางที่สอบถามมีประมาณ 80 ล้านแถว
PK_Reports_Documents
เป็นการรวมกันของ PK ประกอบด้วยReportID INT
และDocumentID CHAR(8)
ดูเหมือนว่าแบบสอบถามจะโหลดวัตถุสถิติที่แตกต่างกันทั้งหมด 5 รายการซึ่งทั้งหมดจะมีReportID
+ คอลัมน์อื่น ๆ จากตาราง พวกเขาทั้งหมดได้รับการปรับปรุงใหม่ RANGE_HI_KEY
ในตารางด้านล่างเป็นค่าคอลัมน์บนที่สูงที่สุดในฮิสโตแกรม
+-------------------------------------------------------------------------+----------+--------------+--------------+---------------------+--------------+------------+----------+---------------------+----------------+
| 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
มีกำหนดให้ทำงานทุกคืนเพื่ออัปเดตสถิติ
_dta_
สถิติพวกเขาอยู่ที่นั่นตั้งแต่ฉันดู DB ครั้งแรก ฉันไม่ทราบว่าการใช้คำแนะนำอาจมีผลร้ายเช่นนั้นได้แม้ว่า ...