मौजूदा गैर-विभाजित तालिका को कैसे विभाजित करें


22

मेरे पास डेटा के साथ एक मौजूदा तालिका है:

dbo.Test (col1,col2,col3....) ON [PRIMARY]

मुझे इस तालिका को इस तरह से विभाजित करने की आवश्यकता है:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

मैं इसे कैसे प्राप्त कर सकता हूं बिना तालिका को गिराए और पुनः बनाए?

जवाबों:


23

तालिका विभाजन के लिए, आप नीचे दिए गए संक्षिप्त चरणों का पालन कर सकते हैं:

  • पहले एक विभाजन फ़ंक्शन और विभाजन योजना बनाएँ
  • उसके बाद आप एक टेबल को पार्टीशन कर सकते हैं।
  • यदि आपकी तालिका में क्लस्टर इंडेक्स है, तो आपको इसे सही विभाजन पर छोड़ने और पुन: बनाने की आवश्यकता है या आप DROP_EXISTINGक्लस्टर इंडेक्स को फिर से बनाने के लिए क्लॉज का उपयोग कर सकते हैं ।
  • यदि आपकी तालिका में क्लस्टर इंडेक्स नहीं है, तो आप विभाजन योजना का उपयोग करके सही विभाजन पर एक बना सकते हैं।
  • इसके अलावा एंटरप्राइज एडिशन में ONLINE=ONआपके आवेदन के लिए किसी भी डाउनटाइम को कम करने के लिए क्रिएट इंडेक्स स्टेटमेंट के विकल्प का उपयोग करने की सुविधा है। ध्यान दें कि जब आप ONLINE विकल्प का उपयोग करते हुए अनुक्रमणिका को फिर से बना रहे हैं, तो आप एक प्रदर्शन में गिरावट देखेंगे।

विभाजन को स्वचालित करने के लिए, आप SQL सर्वर विभाजन प्रबंधन उपयोगिता या कोडप्लक्स पर उपलब्ध SQL सर्वर विभाजन सारणी का उपयोग कर सकते हैं ।

कुछ अच्छे संसाधन:


53

आप यह निर्दिष्ट नहीं करते हैं कि आपकी तालिका में क्लस्टर इंडेक्स है या नहीं, तो चलिए सभी विकल्पों के माध्यम से चलते हैं।

मैं इस उदाहरण विभाजन फ़ंक्शन, विभाजन योजना और तालिका का उपयोग करने जा रहा हूं:

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)ऊपर दिए गए अधिकांश कथनों पर खंड का उपयोग कर सकते हैं । यह आपकी तालिका को अन्य कनेक्शनों के लिए उपलब्ध रखेगा। हालांकि, उस दौरान प्रदर्शन प्रभाव पड़ेगा।


1
बहुत बढ़िया, सबास्टियन! बस उत्कृष्ट बाहर फ्लैट! बस ऊपर # 3 जोड़ने के लिए ... यदि आप SWITCH का उपयोग करना चाहते हैं या बाहर, सभी अनुक्रमित गठबंधन किया जाना चाहिए। गैर-संकुलित, गैर-संरेखित PK बनाने से आप SWITCH करने की अनुमति नहीं देंगे जब तक कि आप पहले सूचकांक को छोड़ने के लिए कदम नहीं उठाते हैं, SWITCH (जो भी दिशा में हो सकता है) करें, और सूचकांक का पुनर्निर्माण करें। यह बहुत बार अभी भी डिलीट के साथ बराबर करने की तुलना में तेज है और निश्चित रूप से, अगर आपको SWITCH का उपयोग करने की आवश्यकता नहीं है, तो समस्या नहीं होगी।
जेफ मोदन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.