2012-03-19 12 views
34

मेरे पास एक तालिका में UNIQUE, NON CLUSTERED अनुक्रमणिका है जो वर्तमान में सूचकांक के लिए 4 कॉलम का उपयोग कर रही है।एसक्यूएल सर्वर: अद्वितीय इंडेक्स में कॉलम जोड़ने के लिए एक सूचकांक कथन कैसे लिखना है?

मैं एक परिवर्तित स्क्रिप्ट बनाना चाहता हूं जो इस सूचकांक में केवल एक और कॉलम जोड़ सकता है। नया कॉलम प्रकार varchar है।

डेटाबेस SQL ​​सर्वर 2005 है।

अग्रिम धन्यवाद।

+2

मुझे यकीन है कि मुझे कुछ याद आ रहा है लेकिन आप केवल 'ड्रॉप इंडेक्स टेबल' का उपयोग क्यों नहीं कर सकते। ; अनन्य INDEX ऑन टेबल (Col1, Col2, Col3, Col4) बनाएं –

+0

@Lieven, मैं इसके बारे में भी सोच रहा था। क्या सुरक्षित रूप से डीआरओपी करना संभव है और फिर तालिका में मौजूदा डेटा के साथ इंडेक्स तैयार करना संभव है? –

+1

हां। आप इच्छानुसार इंडेक्स ड्रॉप और बना सकते हैं। आपको नोटिस हो सकता है कि इंडेक्स खत्म होने पर प्रदर्शन निष्पादन प्रश्नों में एक बूंद है लेकिन एक (नो-क्लस्टर्ड) इंडेक्स ड्रॉप करना और बनाना आपके ** टेबल में संग्रहीत वास्तविक डेटा पर ** कोई ** प्रभाव नहीं है * (क्लस्टर्ड इंडेक्स प्रभाव बनाना आपके डेटा का भौतिक क्रम, लेकिन फिर, ** नहीं ** डेटा खो गया है) * –

उत्तर

63

आप एक सूचकांक में परिवर्तन नहीं कर सकते हैं - तुम सब कर सकते हैं

  1. ड्रॉप पुराने सूचकांक (DROP INDEX (indexname) ON (tablename))
  2. उस में अतिरिक्त स्तंभ के साथ नया सूचकांक फिर से बनाते हैं:

    CREATE UNIQUE NONCLUSTERED INDEX (indexname) 
        ON dbo.YourTableName(columns to include) 
    

SQL सर्वर में ALTER INDEX कथन एक अस्तित्व के कुछ गुण (भंडारण गुण इत्यादि) को बदलने के लिए उपलब्ध है जी सूचकांक, लेकिन यह सूचकांक बनाने वाले कॉलम में परिवर्तन की अनुमति नहीं देता है।

+1

धन्यवाद मार्क, आपका प्रस्तावित समाधान काम करता है, और हमारी टीम पर डीबीए द्वारा अनुमोदित स्क्रिप्ट। –

+35

अब आप मुझे स्टंप कर चुके हैं ... अगर आपके पास आपकी टीम पर डीबीए है तो सवाल क्यों पूछें? –

+3

एमएसडीएन पर इंडेक्स पेज बनाएं में DROP_EXISTING में देखें। कुछ प्रतिबंधों के साथ, आप एक सूचकांक को संशोधित कर सकते हैं। पॉल व्हाइट द्वारा यहां जवाब देखें। http://www.sqlservercentral.com/Forums/Topic913722-391-1.aspx – Gabe

3

यदि सूचकांक में जो नया कॉलम आप जोड़ रहे हैं, कॉलम की सूची के अंत में है - दूसरे शब्दों में, यदि पुरानी अनुक्रमणिका की कॉलम सूची नई अनुक्रमणिका की कॉलम सूची का उपसर्ग है - तो पंक्तियां जो पुराने कॉलम द्वारा क्रमबद्ध हैं, अभी भी नए कॉलम द्वारा क्रमबद्ध किए जाएंगे। साइबेस एसक्यूएल सर्वर और शायद माइक्रोसॉफ्ट एसक्यूएल सर्वर के पुराने संस्करणों में, with sorted_data विकल्प था ताकि आप यह घोषणा कर सकें कि पंक्तियों को पहले से क्रमबद्ध किया गया था। लेकिन एमएसएसएलएल 2008 आर 2 पर इसका कोई असर नहीं पड़ता है; विकल्प स्वीकार किया जाता है लेकिन चुपचाप अनदेखा किया जाता है। किसी भी मामले में मुझे लगता है कि विकल्प क्लस्टर्ड इंडेक्स के साथ अधिकतर उपयोगी था।

अन्य ने with drop_existing का उल्लेख किया, जो बहुत अच्छा लगता है, लेकिन केवल एमएसएसएलएल के अधिक महंगे संस्करणों के लिए है।

+1

आप कहां से sorted_data' प्राप्त कर रहे हैं? मुझे उस स्टेटमेंट के लिए SQL सर्वर 2008+ दस्तावेज़ों में 'निर्माण अनुक्रमणिका' स्टेटमेंट के ''''', aka "relational_index_option" के रूप में सूचीबद्ध 'sorted_data'' नहीं देखा गया है (at: [link] (https: // docs। microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql))। – Tom

+1

'sorted_data' के साथ कुछ ऐसा है जो मुझे सिबबेस एसक्यूएल सर्वर के पुराने दिनों से याद है। माइक्रोसॉफ्ट ने कुछ फंकी इंडेक्स निर्माण विकल्पों को हटा दिया है जो साइबेस समर्थित हैं, लेकिन यह नहीं। हालांकि एमएसएसएलएल 2008 आर 2 पर एक त्वरित प्रयोग से पता चलता है कि यह अब नो-ऑप हो सकता है; तालिका में डेटा सॉर्ट नहीं किया गया है, तो कोई त्रुटि नहीं दी गई है। तो मैं अपना जवाब संशोधित करूंगा। –

+0

एक त्वरित खोज से पता चलता है कि विकल्प को MSSQL 2000 के लिए दस्तावेज़ित किया गया था। –

संबंधित मुद्दे