ฉันมีตารางที่มีอยู่:
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