ทำไมไม่สร้างดัชนีใหม่ด้วยจำนวนหน้า <1,000


17

ฉันใช้สคริปต์ Ola Hallengrens สำหรับการบำรุงรักษาดัชนี ก่อนที่ฉันจะทำอย่างนั้นฉันใช้แบบสอบถามต่อไปนี้เพื่อดูว่าดัชนีใดที่มีการแยกส่วนมากที่สุด:

SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
ORDER BY indexstats.avg_fragmentation_in_percent desc

ในกรณีของฉัน avg_fragmentation มากกว่า70%สำหรับ15ดัชนีและมากกว่า30%สำหรับ28ดัชนี

ดังนั้นฉันสร้างทุกดัชนีใหม่โดยใช้โซลูชันของ Ola Hallengren เมื่อฉันเรียกใช้แบบสอบถามอีกครั้งนี่เป็นผลลัพธ์:

การกระจายตัวของมากกว่า70%สำหรับ12ดัชนีมากกว่า30%สำหรับ15ดัชนี

ฉันคิดว่าเหตุผลก็เพราะpage_countซึ่งต่ำกว่า 1,000 สำหรับแต่ละดัชนีที่ยังมีการแยกส่วนมาก ตัวอย่างเช่นหนึ่งในดัชนีที่มี page_count 967 มีเปอร์เซ็นต์การกระจายตัวของ98,98% ! สำหรับฉันแล้วดูเหมือนว่าคุ้มที่จะสร้างดัชนีนั้นใหม่! ผมและหลังจากนั้นการกระจายตัวเป็น0% นอกจากนี้ดัชนีที่มีpage_count132 ก็เปลี่ยนจาก95%เป็น0%

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

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


ดัชนีขนาดเล็กมีแนวโน้มที่จะถูกแคชในหน่วยความจำ ดัชนีที่ไม่ทำให้เกิด IO จะไม่ได้รับประโยชน์จากการจัดเรียงข้อมูล กฎการนับ 1,000 หน้านี้เป็นแบบแก้ปัญหาได้
usr

คำตอบ:


20

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

  1. จะสามารถปรับปรุงประสิทธิภาพอ่านล่วงหน้าสำหรับขนาดใหญ่สแกนช่วง; และ
  2. มันอาจปรับปรุงความหนาแน่นของหน้า (จำนวนแถวต่อหน้า)

ปัจจัยทั้งสองนี้มีความสำคัญน้อยกว่าสำหรับดัชนีขนาดเล็กตามคำจำกัดความ

ตัวโต้แย้งโต้แย้งเพื่อสร้างดัชนีขนาดเล็กขึ้นใหม่เป็นหลัก:

"ทำไมต้องกังวลคุณไม่มีสิ่งสำคัญที่ต้องกังวลอีกหรือ"

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

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

ดูการบันทึกรายการ PASS TV ของงานนำเสนอของ Paul Randal เกี่ยวกับ Index Fragmentationสำหรับรายละเอียดทั้งหมด

คุณอาจต้องการดู Brent Ozar พูดคุยเกี่ยวกับสาเหตุที่ดัชนีการกระจายตัวไม่สำคัญใน SQL Server

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