2009-03-27 8 views
5

मेरे पास 1 टीबी, 600 मीटर पंक्ति, तालिका है जिसमें अनुक्रमित कॉलम की गुमराह पसंद है, विशेष रूप से प्राथमिक कुंजी कॉलम पर क्लस्टर इंडेक्स जो किसी भी क्वेरी में कभी भी उपयोग नहीं किया जाता है।बड़ी तालिका को फिर से अनुक्रमणित करना - मैं कितना खराब हूं?

मैं इस पंक्ति से क्लस्टर्ड इंडेक्स को हटाना चाहता हूं और इसे कई अन्य पंक्तियों पर बनाना चाहता हूं।

  • कोला (पी, nvarchar (3)) [क्लस्टर सूचकांक pt ख]

  • colB (पी, bigint) [क्लस्टर सूचकांक pt एक]

    :

    टेबल इस तरह वर्तमान में है

  • colC (DATETIME) [गैर क्लस्टर सूचकांक]

  • ठंड (मनी) [गैर क्लस्टर सूचकांक]

  • कोल (बिट) [कोई सूचकांक]

  • Colf (बिट) [कोई सूचकांक]

  • Colg (int) [कोई सूचकांक]

  • अधिक गैर अनुक्रमित कॉलम

मैं इसे बदलने के लिए इस तरह दिखना चाहते हैं:

  • कोला (पी, nvarchar (3)) [क्लस्टर सूचकांक pt एक]

  • colB (पी, bigint) [गैर क्लस्टर सूचकांक]

  • colC (DATETIME) [गैर क्लस्टर सूचकांक]

  • ठंड (मनी) [क्लस्टर सूचकांक pt घ]

  • कोल (बिट) [क्लस्टर सूचकांक pt ख]

  • Colf (बिट) [क्लस्टर सूचकांक pt ग]

  • Colg (int) [क्लस्टर सूचकांक pt ई]

  • अधिक गैर अनुक्रमित कॉलम

दो सवाल: 1) आप यह परिवर्तन है कि कब तक guesstimate हैं ले जाएगा (संदेश के अंत में सर्वर spec)। दुर्भाग्य से यह एक लाइव डीबी है और मुझे कुछ समय के बिना डाउनटाइम नहीं हो सकता है कि यह कितना समय तक नीचे जाएगा।

2) क्या यह क्लस्टर इंडेक्स में इतने सारे कॉलम जोड़ने का एक भयानक विचार है? अपडेट लगभग कभी नहीं किए जाते हैं। कई आवेषण और कई चयन हैं जो हमेशा प्रस्तावित पैरामीटर के रूप में सभी प्रस्तावित अनुक्रमित पंक्तियों का उपयोग करते हैं।

सर्वर स्पेक: RAID 5 में 5 x 15kRPM ड्राइव, एमएस-एसक्यूएल सेवर 2005 और कुछ बिट्स उन्हें चलने के लिए।

उत्तर

0

आपको डाउनटाइम के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि यह possible to do the change live (बिना डाउनटाइम के बिना) हो सकता है। SQL सर्वर 2005 एंटरप्राइज़ संस्करण पर लागू होता है।

3

आपके पास समान चश्मा वाले विकास वातावरण होना चाहिए जिसका उपयोग आप लाइव डेटाबेस की एक प्रति के साथ करने के लिए कर सकते हैं।

+0

यह निश्चित रूप से यह अच्छा होगा। मैं अभी उप $ 7000 उत्तरों की तलाश में हूं, लेकिन भविष्य में आपके सुझाव के साथ जाना पड़ सकता है। –

0

एक चीज जो आप कर सकते हैं यदि डिस्क स्थान सही क्लस्टर्ड इंडेक्स के साथ दूसरी तालिका बनाता है, तो पंक्तियों को प्रतिदिन की प्रक्रिया को कई दिनों में नई तालिका में प्रतिलिपि बनाने की प्रक्रिया के माध्यम से कॉपी करता है। एक बार सभी पंक्तियां दोनों तालिकाओं पर sp_rename निष्पादित कर लेती हैं (इसके लिए केवल कुछ मिनट की डाउनटाइम की आवश्यकता होगी। यदि आपके ऐप्स भौतिक तालिका के बजाय दृश्य को संदर्भित कर रहे थे तो आप इसे अपने ऐप्स पर शून्य डाउनटाइम के साथ कर सकते थे। मुझे उम्मीद है कि इससे मदद मिलती है

[संपादित करें] आपको पंक्तियों के अपडेट से भी निपटना होगा, आपको टाइमस्टैम्प, या स्रोत तालिका पर उपलब्ध अंतिम अद्यतन फ़ील्ड की आवश्यकता होगी ताकि आप सभी के बाद अपडेट को सिंक कर सकें पंक्तियों की प्रतिलिपि बनाई गई।

9

एक बात के लिए, मैं क्लस्टर्ड इंडेक्स को पूरी तरह से व्यापक रूप से बनाना चाहता हूं। इसे पांच भागों में बनाना अनुबंध-उत्पादक के बारे में लगता है। क्या इस यौगिक क्लस्टर्ड इंडेक्स में सभी कॉलम स्थिर हैं, उदाहरण के लिए कभी नहीं बदलते ??

यदि नहीं, तो मैं उन्हें हर कीमत से बचूंगा। एक क्लस्टर सूचकांक होना चाहिए:

  • अद्वितीय
  • स्थिर
  • के रूप में संकीर्ण
  • संभव के रूप में

आप अपने गैर क्लस्टर सूचकांक बदल सकते हैं - कोई बात नहीं। लेकिन क्लस्टर्ड इंडेक्स गन्दा बनाने से बचें! यह निश्चित रूप से आपके प्रदर्शन को नीचे लाएगा!

किम्बर्ली ट्रिप के अनुक्रमण पर उत्कृष्ट ब्लॉग लेख देखें:

मार्क

+0

यह हमेशा सत्य नहीं है। यदि टेबल को विस्तृत क्लस्टर इंडेक्स की तुलना में भारी (जिसे वह है) विशेष रूप से उन फ़ील्ड पर पढ़ा जाता है जो खोज तर्कों के लिए उपयोग किए जाते हैं, तो वास्तव में उनके प्रस्तावित नए क्लस्टर इंडेक्स के उद्देश्य से क्वेरी प्रदर्शन में वृद्धि होगी)। – James

+1

संभवतः - लेकिन एक बात यह है कि बहुत से लोग इस बात पर विचार नहीं करते हैं: पूरी क्लस्टर कुंजी भी गैर-क्लस्टर कुंजी (गैर-क्लस्टर्ड इंडेक्स के सभी पत्ते नोड्स) का हिस्सा होगी और इस प्रकार आवश्यक स्थान को फूट कर सकती है। –

+0

उन Kimberly लेख महान हैं। धन्यवाद। ऐसा लगता है कि अनुक्रमण के लिए इतनी सारी जटिलताएं हैं कि मुझे ठोस जवाब प्राप्त करने के लिए वास्तव में मेरी समस्या का पूरा नमूना पोस्ट करने की आवश्यकता है। मैं इसे सप्ताहांत में पूरा करने और पुनः पोस्ट करने की कोशिश करूंगा। –

0

1) आप कब तक guesstimate होता है कि इस बदलाव के लिए ले जाएगा (संदेश के अंत में सर्वर spec)। दुर्भाग्य से यह एक लाइव डीबी है और मुझे कुछ समय के बिना डाउनटाइम नहीं हो सकता है कि यह कितना समय तक नीचे जाएगा।

यह वास्तव में, वास्तव में डेटा पर निर्भर करता है। केवल टेबल पैरामीटर अकेले पर्याप्त जानकारी प्रदान नहीं करता है। कुछ दिनों (संभावना नहीं) कुछ दिनों के भीतर (संभावना नहीं) हो सकता है कि कहीं भी भीतर के सबसे व्यस्त समय के साथ।

2) क्या यह क्लस्टर इंडेक्स में इतने सारे कॉलम जोड़ने का एक भयानक विचार है? अपडेट लगभग कभी नहीं किए जाते हैं। कई आवेषण और कई चयन हैं जो हमेशा प्रस्तावित पैरामीटर के रूप में सभी प्रस्तावित अनुक्रमित पंक्तियों का उपयोग करते हैं।

नहीं, इससे कोई समस्या नहीं होनी चाहिए। प्रदर्शन केवल तभी सुधारना चाहिए जब आप कुछ अपडेट कर रहे हों।जब वे अपडेट होते हैं, तो सूचकांक को ठीक करने में कुछ समय लगेगा, और उस समय प्रदर्शन प्रदर्शन होगा, जो डेटा के आधार पर अलग-अलग होंगे।

-Adam

2

बदलते संकुल अनुक्रमणिका की तरह यह निश्चित रूप से यहाँ मदद मिलेगी लगता है, यही कारण है कि आप पहली बार एक (nonclustered) को कवर सूचकांक जोड़ने की कोशिश क्यों नहीं करते?

नई अनुक्रमणिका बनने के दौरान तालिका को नीचे नहीं लेना चाहिए, और आपको इस पुनर्गठन के परिणामस्वरूप प्रदर्शन सुधार (यदि कोई हो) का संकेत देना चाहिए।

+0

जब तक कि यह SQL 2005 एंटरप्राइज़ संस्करण (जो वह नहीं कहता) एक नई अनुक्रमणिका बनाने का ऑफ़लाइन ऑपरेशन है। – mrdenny

0

मैं ब्रायन से सहमत हूं, आपके पास डेटा के समान डेटा के साथ एक परीक्षण डेटाबेस होना चाहिए और सूचकांक परिवर्तन को चलाएं। लेकिन, मुझे लगता है कि आप यह परिवर्तन कर रहे हैं क्योंकि आपको लगता है कि यह प्रश्नों को तेज करेगा। आपको बेंचमार्क टेस्ट (इंडेक्स चेंज से पहले और बाद में) चलाया जाना चाहिए और यह सुनिश्चित करना चाहिए कि आपका अनुकूलन निराशाजनक न हो।

6

मैंने बदलाव किए और इसमें बहुत लंबा समय नहीं लगा। यहां प्रत्येक ऑपरेशन के लिए समय हैं, पहली बार जब एक 7200 आरपीएम ड्राइव के साथ बैकअप सर्वर पर चलाया जाता है, और दूसरा मुख्य सर्वर पर RAID में 15k ड्राइव के साथ होता है।

ALTER TABLE Table DROP CONSTRAINT [PK_Table] 

2:39 बजे/19 मिनट

CREATE CLUSTERED INDEX [IX_Clustered] ON [Table] 
(
[a] ASC, 
[b] ASC, 
[c] ASC, 
[d] ASC, 
[e] ASC, 
[f] ASC 
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY] 

15:30 बजे/2 घंटे

ALTER TABLE Table ADD CONSTRAINT 
PK_hands PRIMARY KEY NONCLUSTERED 
(
e, 
h 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

4 घंटे/1 घंटे

चयन क्वेरी सबसे अक्सर इस्तेमाल किया अब < 10 सेकंड लेता है जहां इसे अक्सर 10 से 15 मिनट पहले लिया जाता है। अच्छा सुधार! सम्मिलित समय भी थोड़ा तेज लगते हैं।

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