जवाबों:
तालिका विभाजन के लिए, आप नीचे दिए गए संक्षिप्त चरणों का पालन कर सकते हैं:
DROP_EXISTING
क्लस्टर इंडेक्स को फिर से बनाने के लिए क्लॉज का उपयोग कर सकते हैं ।ONLINE=ON
आपके आवेदन के लिए किसी भी डाउनटाइम को कम करने के लिए क्रिएट इंडेक्स स्टेटमेंट के विकल्प का उपयोग करने की सुविधा है। ध्यान दें कि जब आप ONLINE विकल्प का उपयोग करते हुए अनुक्रमणिका को फिर से बना रहे हैं, तो आप एक प्रदर्शन में गिरावट देखेंगे।विभाजन को स्वचालित करने के लिए, आप SQL सर्वर विभाजन प्रबंधन उपयोगिता या कोडप्लक्स पर उपलब्ध SQL सर्वर विभाजन सारणी का उपयोग कर सकते हैं ।
कुछ अच्छे संसाधन:
आप यह निर्दिष्ट नहीं करते हैं कि आपकी तालिका में क्लस्टर इंडेक्स है या नहीं, तो चलिए सभी विकल्पों के माध्यम से चलते हैं।
मैं इस उदाहरण विभाजन फ़ंक्शन, विभाजन योजना और तालिका का उपयोग करने जा रहा हूं:
CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
GO
CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
GO
1. आपकी तालिका में एक संकुल अनुक्रमणिका है जो एक बाधा द्वारा नहीं बनाई गई थी।
यह सबसे आसान मामला है। आप तालिका को विभाजन योजना में ले जाने के लिए CREATE INDEX
कथन के साथ उपयोग कर सकते हैं DROP_EXISTING
।
उदाहरण के लिए मान लें कि यह क्लस्टर इंडेक्स बनाया गया था:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];
इस तालिका को विभाजित करने के लिए, क्लस्टर किए गए सूचकांक में कुंजी के भाग के रूप में विभाजन कॉलम (हमारे मामले में pt) शामिल है। यह कथन एक ही समय में विभाजन कॉलम और विभाजन को शामिल करने के लिए संकुल सूचकांक को बदलता है:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
DROP_Existing
खंड स्वचालित रूप से नए बनाने से पहले मौजूदा सूचकांक निकाल देता है। यह एक अलग से अधिक पसंद किया जाता है DROP INDEX
क्योंकि यह केवल एक बार फिर से गैर-अनुक्रमित अनुक्रमित होने का कारण बनता है।
2. आपकी तालिका में एक क्लस्टर इंडेक्स होता है जो एक PRIMARY KEY
या UNIQUE
बाधा का हिस्सा होता है और इसमें कुंजी के भाग के रूप में विभाजन कॉलम होता है
यह एक अभी भी आसान है और पिछले एक के समान है।
मान लें कि यह PRIMARY KEY
बाधा तालिका पर बनाई गई थी:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];
अब आप केवल उसी री-क्रिएशन स्क्रिप्ट को चला सकते हैं जिसका उपयोग हमने 1 में किया था:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
3. तालिका में एक क्लस्टर इंडेक्स है जिसमें विभाजन कॉलम शामिल नहीं है, लेकिन एक PRIMARY KEY
या UNIQUE
बाधा के भाग के रूप में बनाया गया था
कठिन भाग्य। आप इस तथ्य के बाद PRIMARY KEY
या UNIQUE
बाधा की परिभाषा नहीं बदल सकते । आपका एकमात्र विकल्प बाधा को गिराना है और फिर या तो इसे विभाजन कॉलम सहित फिर से बनाना है या बाधा से स्वतंत्र क्लस्टर इंडेक्स बनाना है जिसमें विभाजन कॉलम शामिल है। दूसरे मामले में आप NONCLUSTERED
विभाजन कॉलम को शामिल किए बिना बाधा को फिर से बना सकते हैं । क्योंकि अब यह बाधा संरेखित नहीं है (इसका अर्थ है कि इसका समर्थन सूचकांक विभाजित नहीं है) आपको यह निर्दिष्ट करना होगा कि इसे डिस्क पर कहां रखा जाए।
मान लें कि तालिका में इस तरह एक प्राथमिक कुंजी थी:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];
इस तालिका को विभाजित करने के लिए आपको पहले बाधा को छोड़ना होगा:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc;
फिर आपको विभाजन वाले संकुल सूचकांक बनाने की आवश्यकता है:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
यदि आप PRIMARY KEY
बाधा को फिर से बनाने के लिए चुनते हैं, तो आप ऐसा कर सकते हैं:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];
4. आपकी तालिका में संकुल अनुक्रमणिका नहीं है
इस मामले में यह ज्यादातर मामलों में विभाजन को स्थापित करने के लिए क्लस्टर इंडेक्स बनाने की सिफारिश की जाती है। आप इसके लिए पहले देखे गए अनुक्रमणिका विवरण का उपयोग कर सकते हैं:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
हालाँकि, यदि आपके पास क्लस्टर इंडेक्स नहीं बनाने का एक अच्छा कारण है, तो आप निम्न दो-चरण दृष्टिकोण के साथ दूर हो सकते हैं। अफसोस की बात यह है कि इस बदलाव का कोई सीधा रास्ता नहीं है।
मान लें कि आपके टेबल में क्लस्टर इंडेक्स नहीं है। तालिका को विभाजित करने के लिए आपको पहले एक CLUSTERED UNIQUE
बाधा बनाने की आवश्यकता है । (आप एक CLUSTERED PRIMARY KEY
बाधा भी इस्तेमाल कर सकते हैं )। यदि आपके पास एक स्तंभ संयोजन है जो अद्वितीय है जो एक सरल कदम है:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);
बाधा बनने के बाद आप इसे फिर से छोड़ सकते हैं और एक ही समय में नई विभाजन योजना में तालिका को "स्थानांतरित" कर सकते हैं:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));
यदि आपके पास एक स्तंभ संयोजन नहीं है जो अद्वितीय है, तो आप भाग्य से बाहर हैं। इस मामले में आपका एकमात्र विकल्प एक नया कॉलम जोड़ना और इसे अद्वितीय मानों से भरना है। यदि तालिका बहुत छोटी है तो आप ऐसा कुछ कर सकते हैं:
ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);
हालाँकि, जब तक कि सभी पंक्तियों को महत्व नहीं दिया जाता है तब तक एक विशेष टेबल लॉक लगेगा। तालिका आकार के आधार पर यह काफी समय के लिए हो सकता है। उसके बाद स्तंभ बनाया जाता है ऊपर दिए गए दो चरणों का पालन करें ताकि पहले UNIQUE
बाधा पैदा की जा सके और फिर उसे तुरंत छोड़ दिया जा सके। बाद में आप कॉलम को फिर से छोड़ सकते हैं। इन सभी चरणों में काफी दखलंदाज़ी है, इसलिए आप शायद मेज पर केवल एक क्लस्टर इंडेक्स बनाने के लिए बेहतर हैं। वह अद्वितीय होना भी नहीं है।
यदि आपके पास एंटरप्राइज़ संस्करण है, तो आप WITH(ONLINE=ON)
ऊपर दिए गए अधिकांश कथनों पर खंड का उपयोग कर सकते हैं । यह आपकी तालिका को अन्य कनेक्शनों के लिए उपलब्ध रखेगा। हालांकि, उस दौरान प्रदर्शन प्रभाव पड़ेगा।