การกระจายตัวของสิ่งที่หมายถึงในกอง
ค่าการแตกแฟรกเมนต์ในฮีปที่คุณได้รับจากคอลัมน์avg_fragmentation_in_percent
โดยการเคียวรีsys.dm_db_index_physical_stats
DMV ระบุว่า
การแตกแฟรกเมนต์เชิงตรรกะสำหรับดัชนีหรือการกระจายตัวของขอบเขตสำหรับฮีปในหน่วยการจัดสรร IN_ROW_DATA
ยิ่งไปกว่านั้น BOL คนเดียวกันก็บอกว่า
นี่คือเปอร์เซ็นต์ของส่วนขยายที่ไม่อยู่ในลำดับในหน้าใบไม้ของกอง ขอบเขตที่ไม่อยู่ในลำดับคือขอบเขตที่มีหน้าปัจจุบันสำหรับฮีปนั้นไม่ได้อยู่ในขอบเขตถัดไปหลังจากขอบเขตที่มีเพจก่อนหน้า
ดังนั้นคุณจะเห็นได้ว่าไม่ใช่พื้นที่ว่างที่มีอยู่ในเพจที่จัดสรรให้กับ Heapแต่เป็นลำดับที่แตกต่างกันของหน้าเว็บที่สร้างการแตกแฟรกเมนต์
สิ่งนี้สามารถพิสูจน์ได้ด้วยการทดสอบขนาดเล็ก ให้เราสร้างตารางฮีปและแทรกเรคคอร์ดบางอย่างในนั้นจากนั้นตรวจสอบการแตกแฟรกเมนต์
create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1 char(5000) Not null Default ('Heaps Are Cool')
)
SET NOCOUNT ON
Insert into dbo.Heaptest default values
go 50
select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')
ดังนั้นจึงสร้างตารางฮีปขึ้น 50 เรคคอร์ด ด้านล่างนี้เป็นลักษณะของการแตกแฟรกเมนต์หลังจากแบบสอบถาม DMV sys.dm_db_index_physical
คุณสามารถดูavg_fragmentation_in_percent
ค่าคอลัมน์ได้ 33% ตอนนี้ให้เราดูว่าหน้าจัดเรียงอย่างไร ซึ่งสามารถทำได้โดยใช้ที่ไม่มีเอกสาร%%lockres%%
แบบสอบถาม แบบสอบถามจะเป็น
SELECT %%lockres%%, * FROM dbo.HeapTest;
และด้านล่างคือผลลัพธ์ที่ดูเหมือน แนบเฉพาะส่วนที่เกี่ยวข้องเท่านั้น แบบสอบถามสร้างจำนวน 50 แถวเนื่องจากเราใส่ 50 แถวในตาราง dbo.HeapTest ของเรา
สิ่งที่กล่าวเป็นหน้าแรกมีรหัส197
หน้าถัดไปมีรหัส242
หน้าถัดไปมีรหัสอย่างต่อเนื่องจนกว่าจะถึงหมายเลขหน้าเพราะหลังจากที่เราได้รับหมายเลขหน้า264
280
ดังนั้นการเพิ่มจำนวน ID หน้านี้เป็นสิ่งที่ทำให้เกิดการแตกแฟรกเมนต์
ตอนนี้เพื่อสร้างฮีปใหม่และรันคำสั่งอีกครั้งเพื่อดูการแตกแฟรกเมนต์และวิธีจัดเรียงหน้า เราได้รับการกระจายตัวเช่น
14%
คุณสามารถดูการกระจายตัวอยู่ในขณะนี้
ให้เราดูการจัดสรรหมายเลขหน้า
เรามีการข้ามส่วนที่เหลือเพียงครั้งเดียวทุกหน้าได้รับการจัดสรร ID หน้าแบบซีเรียล เนื่องจากการกระจายตัวของกระโดดเพียงครั้งเดียวลดลงอย่างมาก
ฉันสร้าง Heap ใหม่อีกครั้งและตอนนี้เมื่อฉันตรวจสอบการแตกแฟรกเมนต์มันหายไปอย่างสมบูรณ์ และการจัดสรร ID หน้าก็เหมือนกัน
ทำไมการกระจายตัวเพิ่มขึ้น
ตอนนี้เกี่ยวกับสิ่งที่อาจทำให้การแตกแฟรกเมนต์เพิ่มขึ้นเราสามารถยืนยันได้ว่าเมื่อหน้าเว็บได้รับการจัดสรรไปยังฮีปพวกเขาจะไม่ต่อเนื่องดังที่คุณเห็นข้างต้นสิ่งที่ทำให้ค่าการแตกแฟรกเมนต์เพิ่มขึ้นคือ
ที่ด้านหลังของศีรษะคุณควรจำไว้ว่าคำว่าการกระจายตัวของ HEAP นั้นไม่มีความหมายใด ๆ คุณจะกำหนดความกระจัดกระจายอย่างไรสำหรับกลุ่มเพจที่ไม่ได้เรียงลำดับ
กังวลเกี่ยวกับการแยกส่วน
หากคุณเผชิญกับสถานการณ์จริง ๆ ที่ตารางฮีปมีการแยกส่วนและเคียวรีช้าลงการสร้างดัชนีแบบคลัสเตอร์บนตารางจะดีกว่าการสร้างใหม่ เหตุผลคือเมื่อคุณสร้างฮีปดัชนีที่ไม่ใช่คลัสเตอร์พื้นฐานทั้งหมดจะถูกสร้างใหม่อีกครั้งทำให้กระบวนการสร้างใหม่ใช้เวลานานขึ้นใช้ทรัพยากรและบันทึกธุรกรรมจำนวนมาก ในระบบการผลิตเราจะพยายามหลีกเลี่ยงปัญหานี้เสมอ พอลปกคลุมนี้ของเขาในตำนานมาตราเกี่ยวกับกอง
PS:โปรดอย่าใช้คำสั่งที่ไม่มีเอกสารในระบบการผลิต นี่เป็นเพียงการสาธิต