สถิติเป็นข้อมูลล่าสุด แต่การประมาณการไม่ถูกต้อง


12

เมื่อฉันฉันจะ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 มีกำหนดให้ทำงานทุกคืนเพื่ออัปเดตสถิติ

คำตอบ:


10

มีวิธีง่ายๆในการนี้:

วาง_dta_...สถิติทั้งหมดและหยุดใช้คำแนะนำ DTA แบบสุ่ม

ข้อมูลมากกว่านี้

ปัญหาเฉพาะคือมีสถิติหลายชุดสำหรับคอลัมน์ที่เป็นปัญหา dtaสถิติพิเศษถูกสร้างขึ้นโดยการสุ่มตัวอย่างข้อมูล (พฤติกรรมเริ่มต้นสำหรับสถิติที่ไม่เกี่ยวข้องกับดัชนี)

บ่อยครั้งที่เป็นกรณีที่มีสถิติตัวอย่างฮิสโทแกรมที่ได้นั้นไม่ครอบคลุมช่วงเต็มของข้อมูลที่ไม่มีการอ้างอิง แบบสอบถามในคำถามเกิดขึ้นเพื่อเลือกค่าที่อยู่นอกฮิสโตแกรมส่งผลให้เกิดการประมาณ 1 แถว

พฤติกรรมที่แน่นอนของเคียวรีเครื่องมือเพิ่มประสิทธิภาพเมื่อมีสถิติหลายชุดสำหรับคอลัมน์เดียวกันนั้นยังไม่ได้บันทึกไว้อย่างสมบูรณ์ มันมักจะชอบสถิติ 'สแกนเต็ม' มากกว่าสุ่มตัวอย่าง แต่ก็ชอบสถิติที่อัปเดตล่าสุดมากกว่าเมื่อเทียบกับสถิติเก่า


มันใช้งานได้จริง อย่างไรก็ตามฉันไม่ได้สร้าง_dta_สถิติพวกเขาอยู่ที่นั่นตั้งแต่ฉันดู DB ครั้งแรก ฉันไม่ทราบว่าการใช้คำแนะนำอาจมีผลร้ายเช่นนั้นได้แม้ว่า ...
user1151923
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.