เหตุใดจึงสร้างดัชนี ... ด้วยออนไลน์ = บล็อกการเข้าถึงตารางในช่วงเวลาไม่กี่นาที


22

ฉันมีตารางที่มีอยู่:

CREATE TABLE dbo.ProofDetails
(
    ProofDetailsID int NOT NULL 
        CONSTRAINT PK_ProofDetails 
        PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , ProofID int NULL
    , IDShownToUser int NULL
    , UserViewedDetails bit NOT NULL 
        CONSTRAINT DF_ProofDetails_UserViewedDetails 
        DEFAULT ((0))
);

ตารางนี้มี 150,000,000 แถว ระบบกำลังทำงาน 24x7x365 ดังนั้นจึงไม่มีหน้าต่างการบำรุงรักษาที่เกิดขึ้นเป็นประจำ

ฉันต้องการเพิ่มดัชนีลงในตารางและด้วย Enterprise Edition ของ SQL Server ฉันควรจะทำเช่นนั้นได้โดยไม่ปิดกั้นการเข้าถึงการเขียนลงในตาราง คำสั่งที่ฉันใช้คือ:

CREATE INDEX IX_ProofDetails_ProofID_Etc 
ON dbo.ProofDetails (ProofID, IDShownToUser)
INCLUDE (UserViewedDetails)
WITH (ONLINE=ON
    , ALLOW_ROW_LOCKS=ON
    , ALLOW_PAGE_LOCKS=ON
    , FILLFACTOR=100
    , MAXDOP=4
);

ผมดำเนินการคำสั่งด้วยตัวเองใน SSMS F5โดยการกด ใช้เวลานานกว่าหนึ่งนาทีจากนั้นเริ่มบล็อกเซสชันอื่น ฉันจึงยกเลิกCREATE INDEXคำสั่งทันทีเนื่องจากฉันไม่สามารถบล็อกเซสชันอื่นได้

ในช่วงนาทีแรกไม่มีอะไรบล็อกCREATE INDEXคำสั่งของฉันsys.dm_exec_requestsแสดงกระบวนการด้วยประเภทรอCXPACKET- แน่นอน ฉันไม่คิดว่ามันเป็นสิ่งที่ไม่ดีตั้งแต่การดำเนินการแบบขนาน

sys.dm_exec_requestsฉันไม่ได้มีจำนวนมากของเวลาในการตรวจสอบการส่งออกของ WHERE session_id = xxxมีเพียงแถวเดียวกลับมาจากแบบสอบถาม เซสชันที่ถูกบล็อกพยายามแทรกแถวลงในตารางเป้าหมาย

ฉันไม่รู้ว่าล็อคนานแค่ไหนยกเว้นจะบอกว่าฉันยกเลิกการดำเนินการของคำสั่งประมาณ 2 นาทีหลังจากที่มันเริ่ม บล็อกกำลังเกิดขึ้นประมาณหนึ่งนาที ณ จุดนั้น

ฉันเข้าใจผิดเกี่ยวกับการใช้งานWITH (ONLINE=ON)หรือไม่ หรือมีอย่างอื่นที่ฉันต้องระวัง?

เซิร์ฟเวอร์เป็นเครื่องที่ค่อนข้างอ้วนด้วยโปรเซสเซอร์ Quad-Core Xeon E5-2643 3.3Ghz 2 ตัว, RAM 192GB และที่เก็บข้อมูล SAN ที่มีความสามารถมากกว่า 5,000+ โดยทั่วไปแล้วซีพียูจะต่ำกว่า 20% แรมใช้ 93% ซึ่งส่วนใหญ่เป็น SQL Server ไม่มีสิ่งใดที่ทำงานอยู่ในกล่องเพียง Windows Server 2012 และ SQL Server 2012

คำตอบ:


23

เมื่อสร้างดัชนีที่มี online = on กระบวนการสร้างดัชนีจะไม่ปิดกั้นเมื่อสร้างวัตถุดัชนีเอง แต่เมื่อใกล้ถึงจุดสิ้นสุดของกระบวนการแล้วมันจะได้รับการล็อคการปรับเปลี่ยนสกีมาเป็นระยะเวลาเพื่อให้เป็นจริง เพิ่มดัชนีลงในตารางประเภทการล็อคนี้จะบล็อกการดำเนินการภายนอกทั้งหมดจนกว่าจะมีการเปิดตัวการล็อกซึ่งอาจเป็นสาเหตุของปัญหาการบล็อกของคุณ

* Sch-Mไม่จำเป็นต้องล็อคสำหรับการสร้างออนไลน์ของดัชนี nonclustered ใหม่แม้ว่าจะต้องใช้ในกรณีอื่น ๆ ทั้งหมด ดัชนี nonclustered ใหม่ต้องใช้ล็อคระดับโต๊ะร่วมกันในช่วงสุดท้ายเท่านั้นเช่นเดียวกับที่จำเป็นในระหว่างขั้นตอนการเตรียมการ

ดูกระดาษสีขาวนี้สำหรับรายละเอียด:

การดำเนินการจัดทำดัชนีออนไลน์ใน SQL Server 2005

ตามที่แนะนำโดยMushtaq Mohammedในความคิดเห็นเกี่ยวกับคำถามดูด้วย:

การดำเนินงานของยูนิคอร์นสายรุ้งและดัชนีออนไลน์โดยPaul Randal

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