ดัชนีแนวทางปฏิบัติที่ดีที่สุดที่ไม่ได้ใช้


11

จากแบบสอบถามนี้ถ้าฉันเห็นจำนวนการอ่านน้อย (ใกล้เคียงกับ 0 หรือ 0, เช่น 1 หรือ 2) และการอัปเดตผู้ใช้จำนวนมากหรือปานกลาง (ฉันไม่สามารถค้นหาแทรกหรือลบด้วยแบบสอบถามนี้) จำนวนแถวขนาดใหญ่ฉันควรลบดัชนีในทฤษฎี

SELECT DISTINCT
    OBJECT_NAME(s.[object_id]) AS ObjectName
       , p.rows TableRows
       , i.name AS [INDEX NAME]
       , (user_seeks + user_scans + user_lookups) AS TotalReads
       , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
        AND i.index_id = s.index_id 
    INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
       AND s.database_id = DB_ID()
       AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

ฉันต้องการตรวจสอบความถูกต้องของสมมติฐานนี้ที่นี่ ตัวอย่างเช่นดัชนีที่มีมานานกว่าหนึ่งปี แต่ไม่เคยอ่านมาก่อน แต่ได้รับการอัปเดตสูงดูเหมือนจะเป็นความคิดที่ไม่ดี มีสถานการณ์สมมติที่สมมติฐานนี้ไม่ถูกต้องหรือไม่?

คำตอบ:


15

DMV นี้เก็บรักษาสถิติตั้งแต่ SQL Server รีสตาร์ทครั้งล่าสุดเท่านั้น มุมมองจะถูกลบออกอย่างสมบูรณ์และทุกอย่างเริ่มต้นจากศูนย์

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

ดังนั้นการตัดสินใจโดยใช้การอ่านระดับต่ำตั้งแต่การรีสตาร์ทครั้งล่าสุดเมื่อการรีสตาร์ทครั้งล่าสุดอาจเป็นเพราะการอัปเดตล่าสุดของวันอังคารหรืออัพเดตเซอร์วิสแพ็คของเมื่อวานนี้อาจไม่ฉลาด หรือเมื่อคุณทำการบำรุงรักษาดัชนีตั้งแต่การสร้างครั้งล่าสุด อาจมีรายงานที่เรียกใช้เพียงเดือนละครั้งหรือไตรมาสละครั้งหรือปีละครั้งและจะดำเนินการโดยบุคคลที่สำคัญและใจร้อน

นอกจากนี้ดัชนีอาจมีสิ่งที่จะเกิดขึ้นในอนาคตที่คุณไม่รู้ - ชุดของรายงานที่เตรียมไว้สำหรับฤดูภาษีสมมติว่า

ดังนั้นคำแนะนำของฉันคือ:

ใช้ DMV เพื่อระบุดัชนีผู้สมัครที่จะลบแต่ไม่ตัดสินใจในฟองสบู่ - คุณต้องทำ legwork เพื่อพิจารณาว่าทำไมดัชนีอาจมีอยู่ก่อนที่จะวางทิ้งแม้ว่าจะดูเหมือนว่ามันไม่ได้ถูกใช้ในปัจจุบัน .


@AaronBertrand ดังนั้นการติดตามประวัติ (รวมถึงเวลาของการรีสตาร์ทครั้งล่าสุด) จะเป็นการเพิ่มที่ดีในเรื่องนี้หรือไม่? ขอบคุณสำหรับคำตอบ
DoubleVu

1
@ DoubleVu ใช่แล้วการเก็บภาพรวมของประวัติการใช้ดัชนีน่าจะคุ้มค่าเพื่อที่คุณจะได้ทำการตัดสินใจอย่างมีความรู้ที่ไม่ได้รับผลกระทบจากสิ่งใดที่อาจเปลี่ยนผลลัพธ์ของสถิติการใช้งาน DMV
Aaron Bertrand

2

ใช่มุมมองมีสถิติตั้งแต่รีบูตครั้งล่าสุดเท่านั้น เพื่อช่วยลดปัญหาที่ฉันตั้งค่างานที่เรียกใช้แบบสอบถามเช่นเดียวกับที่คุณโพสต์รายเดือนในช่วงเช้าก่อนที่หน้าต่างการบำรุงรักษาของเราเริ่มที่จะรวบรวมข้อมูลทุกเดือนก่อนที่เซิร์ฟเวอร์จะรีบูต นั่นทำให้ฉันสามารถย้อนกลับไปดูแนวโน้มได้ตลอดเวลา ฉันยังมีคำถามที่สองที่วิ่งหาดัชนีอาจหายไป

สิ่งที่ต้องพิจารณาอีกประการหนึ่งคือสิ่งที่ดัชนี (es) อื่น ๆ อยู่ในตาราง อาจไม่ได้รับการใช้เพราะส่วนใหญ่หรือซ้ำกันอย่างสมบูรณ์ของดัชนีอื่น ใช่. เซิร์ฟเวอร์ SQL ช่วยให้คุณสร้างดัชนีที่แตกต่างกัน แต่เหมือนกันสองดัชนีดังนั้นจึงเป็นไปได้ที่จะทำซ้ำซ้อนอย่างสมบูรณ์

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

ดัชนีจบลงด้วยการเป็นศิลปะมากที่สุดเท่าที่มันเป็นวิทยาศาสตร์เพราะมันยากที่จะรู้ทุกอย่างเกี่ยวกับสิ่งที่อาจจะทำงานและมันก็จบลงด้วยการเปลี่ยนแปลงบ่อยอยู่แล้ว

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