เหตุใดการปิดใช้งานดัชนีคลัสเตอร์จึงทำให้ตารางไม่สามารถเข้าถึงได้


11

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

เหตุใดจึงไม่สามารถเข้าถึงข้อมูลโดยตรงจากตารางที่ทิ้งต้นไม้ทรี B (น่าจะเป็นโดยการสแกนตารางทีละแถว) มันจะไม่เหมาะสมกว่าการทำให้ข้อมูลไม่สามารถเข้าถึงได้อย่างสมบูรณ์?

มันเป็นคำถามเชิงทฤษฎีล้วนๆ - ฉันจะไม่ทำอย่างนั้นจริง ๆ มันไม่ใช่สถานการณ์หรือสิ่งที่ต้องทำฉันแค่อยากรู้ว่าทำไมสิ่งนั้นถึงเป็นเช่นนั้นลองพิจารณาคำถามภายใน

คำตอบ:


10

เหตุใดจึงไม่สามารถเข้าถึงข้อมูลโดยตรงจากตารางที่ทิ้งต้นไม้ทรี B (น่าจะเป็นโดยการสแกนตารางทีละแถว) จะไม่เหมาะสมกว่าข้อมูลที่ไม่สามารถเข้าถึงได้ทั้งหมดหรือไม่

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

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

ด้านล่างจะอธิบายรายละเอียดให้คุณ:

เราจะใช้ฐานข้อมูล Adventureworks เพื่อดูผลของการปิดการใช้งานดัชนีCLUSTERED

ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบการนับแถวในตาราง:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ปิดการใช้งานดัชนีแบบคลัสเตอร์

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้เลือกจำนวนแถวจากตาราง คราวนี้มันจะผิดพลาดด้วยข้อความด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

แม้แต่การจัดระเบียบใหม่ก็ไม่ทำงาน !!

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้สร้างดัชนีคลัสเตอร์ใหม่และควรทำงานได้ดี

ป้อนคำอธิบายรูปภาพที่นี่

เลือกตารางเพื่อดูว่าเราสามารถเข้าถึงข้อมูลได้หรือไม่

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสิ่งที่สำคัญที่สุดคือถ้าเราปิดการใช้งานดัชนีแบบกลุ่มข้อมูลในตารางยังคงมีอยู่ แต่จะไม่สามารถเข้าถึงได้สำหรับสิ่งอื่นใดนอกจากการดำเนินการแบบหล่นหรือการสร้างใหม่ ดัชนีและมุมมองที่ไม่ใช่คลัสเตอร์ที่เกี่ยวข้องทั้งหมดจะไม่สามารถใช้งานได้รวมถึง Foreign Keys ที่อ้างถึงตารางจะถูกปิดใช้งานและจะมีการนำ FAILURE สำหรับแบบสอบถามทั้งหมดที่อ้างถึงตาราง

หมายเหตุ: ไม่มีตัวเลือกให้เปิดใช้งานดัชนี คุณต้องสร้างใหม่


2

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

ฉันไม่แน่ใจจริงๆว่าทำไม SQL Server ถึงให้คุณทำเช่นนี้

CREATE TABLE T
(
    X INT CONSTRAINT PK PRIMARY KEY CLUSTERED, 
    Y INT CONSTRAINT UQ UNIQUE NONCLUSTERED
);

ALTER INDEX PK ON T DISABLE;

... ยังปิดการใช้งาน NCI ดังนั้นแม้แต่การSELECTสอบถามที่จะครอบคลุมโดยที่ถูกปิดการใช้งาน ฉันไม่สามารถนึกถึงกรณีการใช้งานสำหรับสิ่งนี้ - มาร์ตินสมิ ธ

การใช้งานเพียงอย่างเดียวที่ฉันสามารถคิดออกจากหัวของฉันเป็นสิ่งที่ถูกกล่าวถึง ปิดการใช้งานตาราง หากคุณมีตารางที่คุณไม่ต้องการให้ใครแตะdboหรือแม้กระทั่งsysadminจากนั้นคุณสามารถปิดการใช้งานดัชนีคลัสเตอร์ ตารางมีอยู่พร้อมกับข้อมูล แต่ไม่สามารถเข้าถึงได้อย่างสมบูรณ์จนกว่าคุณจะเปิดใช้งานดัชนีคลัสเตอร์อีกครั้ง - เคนเน็ ธ ฟิชเชอร์

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