ทำไมเราต้องสร้างและจัดระเบียบดัชนีใหม่ใน SQL Server


28

หลังจากค้นหาอินเทอร์เน็ตฉันไม่สามารถหาสาเหตุได้

  1. ทำไมเราต้องสร้างและจัดระเบียบดัชนีใหม่ใน SQL Server

  2. เกิดอะไรขึ้นภายในเมื่อเราสร้างและจัดระเบียบใหม่

บทความในเว็บไซต์พูดว่า:

ดัชนีควรสร้างใหม่เมื่อการแตกแฟรกเมนต์ดัชนีดีกว่า 40% ดัชนีควรถูกจัดระเบียบใหม่เมื่อการกระจายตัวของดัชนีอยู่ระหว่าง 10% ถึง 40% กระบวนการสร้างดัชนีใหม่ใช้ CPU มากขึ้นและล็อคทรัพยากรฐานข้อมูล เวอร์ชันการพัฒนา SQL Server และเวอร์ชันองค์กรมีตัวเลือก ONLINE ซึ่งสามารถเปิดได้เมื่อสร้างดัชนีใหม่ ตัวเลือกออนไลน์จะทำให้ดัชนีพร้อมใช้งานในระหว่างการสร้างใหม่

ฉันไม่สามารถเข้าใจได้ถึงแม้ว่ามันจะบอกว่าWHENต้องทำสิ่งนี้ แต่ฉันอยากรู้ว่าWHYเราจำเป็นต้องสร้างและจัดระเบียบดัชนีใหม่หรือไม่


1
นี่คือคำถามเกี่ยวกับสาเหตุและที่นี่เป็นคำถามเกี่ยวกับเมื่อ
Nick Chammas

คำตอบ:


28

เมื่อคุณทำการแทรกและลบการอัพเดตดัชนีของคุณจะถูกแยกส่วนทั้งภายในและภายนอก

การแตกแฟรกเมนต์ภายในคือคุณมีพื้นที่ว่างสูงในหน้าดัชนีซึ่งหมายความว่า SQL Server จำเป็นต้องอ่านหน้าเพิ่มเติมเมื่อทำการสแกนดัชนี

การแตกแฟรกเมนต์ภายนอกคือเมื่อหน้าของดัชนีไม่อยู่ในลำดับใด ๆ ดังนั้น SQL Server ต้องทำงานมากขึ้นโดยเฉพาะในแง่ของ IO เพื่ออ่านดัชนี

หากดัชนีของคุณมีการแยกส่วนที่ดีที่สุดแบบสอบถามของคุณจะมีประสิทธิภาพน้อยลง แต่ที่แย่ที่สุด SQL Server จะหยุดใช้ดัชนีทั้งหมดเข้าด้วยกันซึ่งหมายความว่าแบบสอบถามทั้งหมดจะต้องทำการสแกนตารางหรือสแกนดัชนีแบบกลุ่ม สิ่งนี้จะทำร้ายการแสดงของคุณมาก!

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

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

โปรดอย่าคาดหวังว่าจะมีการแตกแฟรกเมนต์ 0 หลังจากสร้างใหม่ ถ้าคุณใช้คำแนะนำการค้นหา MAXDOP, SQL Server จะขนานการดำเนินการสร้างใหม่และตัวประมวลผลเพิ่มเติมที่เกี่ยวข้องการกระจายตัวที่มีความเป็นไปได้มากขึ้นเพราะแต่ละหน่วยประมวลผลหรือคอร์จะสร้างส่วนหรือส่วนของดัชนีแยกกันโดยไม่คำนึงถึง ซึ่งกันและกัน นี่เป็นการแลกเปลี่ยนระหว่างระดับการแยกส่วนที่ดีที่สุดและเวลาที่ใช้ในการสร้างดัชนีใหม่ สำหรับการแตกแฟรกเมนต์ใกล้ 0 ให้ใช้ MAXDOP 1 และเรียงลำดับผลลัพธ์ใน TempDB


Great ... ! อธิบายง่ายๆ ... !
DineshDB

0

เพื่อที่จะลบการแยกส่วนซึ่งทำให้เกิดปัญหาเช่นระดับความช้าของฐานข้อมูล / แบบสอบถามที่ใช้เวลานานเป็นต้น

หากต้องการรับความเข้าใจอย่างละเอียดเกี่ยวกับการแตกแฟรกเมนต์และวิธีสร้างและจัดระเบียบดัชนีใหม่ (หรือจัดระเบียบหน้าดัชนีใหม่) สำหรับลิงก์อ้างอิงด้านล่างนี้: https://www.idera.com/productssolutions/sqlserver/sqldefragmanager/what-is-fragmentation


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