สถานการณ์หนึ่งที่เป็นไปได้ที่ทำให้ฉันสนุกมาก:
- ตอนแรกแถวถูกเขียนเมื่อฐานข้อมูลไม่ได้เปิด Read Committed Snapshot (RCSI), Snapshot Isolation (SI) หรือกลุ่มความพร้อมใช้งาน (AGs)
- เปิดใช้งาน RCSI หรือ SI หรือฐานข้อมูลถูกเพิ่มเข้าไปในกลุ่มความพร้อมใช้งาน
- ในระหว่างการลบการประทับเวลาขนาด 14 ไบต์ถูกเพิ่มในแถวที่ถูกลบเพื่อรองรับการอ่าน RCSI / SI / AG
เนื่องจากเซิร์ฟเวอร์นี้เป็นเซิร์ฟเวอร์หลักใน AG จึงได้รับผลกระทบเหมือนกับที่อื่น ๆ ข้อมูลรุ่นจะถูกเพิ่มลงในหน้าหลัก - หน้าข้อมูลจะเหมือนกันทั้งบนหน้าจอและหน้าจอ คนที่สองใช้ประโยชน์จากที่เก็บรุ่นเพื่ออ่านในขณะที่แถวกำลังได้รับการปรับปรุงโดย AG แต่บุคคลที่สองไม่ได้เขียนบันทึกเวลาในเวอร์ชันของตัวเองลงในหน้า พวกเขาเพียงรับรุ่นจากงานหลัก
เพื่อแสดงการเติบโตฉันใช้การส่งออกฐานข้อมูลสแต็คโอเวอร์โฟลว์ (ซึ่งไม่ได้เปิดใช้งาน RCSI) และสร้างดัชนีหลายรายการในตารางโพสต์ ฉันตรวจสอบขนาดดัชนีด้วย sp_BlitzIndex @Mode = 2 (คัดลอก / วางลงในสเปรดชีตและทำความสะอาดเล็กน้อยเพื่อเพิ่มความหนาแน่นของข้อมูลให้มากที่สุด):
ฉันลบไปแล้วประมาณครึ่งหนึ่งของแถว:
BEGIN TRAN;
DELETE dbo.Posts WHERE Id % 2 = 0;
GO
ในขณะที่การลบเกิดขึ้นอย่างน่าประหลาดใจแฟ้มข้อมูลก็เพิ่มขึ้นเพื่อรองรับการประทับเวลาด้วยเช่นกัน! รายงานการใช้งานดิสก์ SSMS แสดงกิจกรรมการเติบโต - นี่เป็นเพียงตัวอย่างด้านบน:
(ต้องรักการสาธิตที่การลบทำให้ฐานข้อมูลเติบโตขึ้น) ในขณะที่การลบกำลังทำงานอยู่ฉันวิ่ง sp_BlitzIndex อีกครั้ง โปรดทราบว่าดัชนีคลัสเตอร์มีแถวน้อยลง แต่ขนาดเพิ่มขึ้นประมาณ 1.5GB ดัชนีแบบ nonclustered บน AcceptedAnswerId มีการเติบโตอย่างมาก - ดัชนีเหล่านี้มีค่าเล็กน้อยซึ่งส่วนใหญ่เป็นโมฆะดังนั้นขนาดดัชนีจึงเกือบสองเท่า!
ฉันไม่ต้องรอให้การลบเสร็จสิ้นเพื่อพิสูจน์สิ่งนั้นดังนั้นฉันจะหยุดการสาธิตที่นั่น จุดคือ: เมื่อคุณทำการลบข้อมูลขนาดใหญ่บนตารางที่มีการใช้งานก่อนที่จะเปิดใช้งาน RCSI, SI หรือ AGs ดัชนี (รวมถึงคลัสเตอร์) จะสามารถเติบโตได้จริงเพื่อรองรับการเพิ่มของการกำหนดเวลาเก็บรุ่น