मिनट के समय पर तालिका के लिए ऑनलाइन ब्लॉक = ON IND के साथ INDEX कैसे बनता है?


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 के संचालन में है, इसलिए नियमित रूप से रखरखाव वाली खिड़कियां नहीं हैं।

मैं तालिका में एक इंडेक्स जोड़ना चाहता हूं, और एसक्यूएल सर्वर के एंटरप्राइज संस्करण के साथ, मुझे ऐसा करने में सक्षम होना चाहिए, ताकि टेबल पर लिखने की पहुंच को अवरुद्ध किए बिना। मेरे द्वारा उपयोग की जाने वाली कमांड थी:

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)? या कुछ और है जिसकी मुझे जानकारी होनी चाहिए?

सर्वर एक काफी मांसल मशीन है, जिसमें 2 क्वाड-कोर Xeon E5-2643 3.3Ghz प्रोसेसर, 192GB रैम और सैन स्टोरेज 5,000+ iops के लिए सक्षम है। सीपीयू आम तौर पर 20% से नीचे है, रैम 93% उपयोग किया जाता है, ज्यादातर SQL सर्वर द्वारा। बॉक्स पर और कुछ नहीं चल रहा है, बस विंडोज सर्वर 2012 और एसक्यूएल सर्वर 2012 है।

जवाबों:


23

ऑनलाइन = के साथ एक इंडेक्स बनाते समय, इंडेक्स ऑब्जेक्ट बनाते समय इंडेक्स प्रक्रिया ब्लॉक नहीं होगी, लेकिन जब यह प्रक्रिया के अंत के करीब आती है, तो यह वास्तव में एक अवधि के लिए स्कीमा संशोधन लॉक का अधिग्रहण करेगा। तालिका में अनुक्रमणिका जोड़ें, यह लॉक प्रकार तब तक सभी बाहरी कार्यों को अवरुद्ध करेगा जब तक कि लॉक जारी नहीं किया जाता है, जो आपके अवरुद्ध मुद्दों के लिए जिम्मेदार हो सकता है।

* Sch-Mनए गैर-अनुक्रमित सूचकांक के ऑनलाइन निर्माण के लिए लॉक की आवश्यकता नहीं है, हालांकि अन्य सभी मामलों में इसकी आवश्यकता है। एक नए गैर-अनुक्रमित सूचकांक में अंतिम चरण के दौरान केवल एक टेबल-स्तरीय साझा लॉक की आवश्यकता होती है, जैसा कि तैयारी चरण के दौरान आवश्यक था।

विवरण के लिए यह श्वेत पत्र देखें:

SQL Server 2005 में ऑनलाइन अनुक्रमण संचालन

मुश्ताक मोहम्मद द्वारा प्रश्न पर एक टिप्पणी के रूप में सुझाव दिया गया है , यह भी देखें:

पॉल रैंडल द्वारा यूनिकॉर्न, इंद्रधनुष, और ऑनलाइन सूचकांक संचालन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.