2010-04-28 21 views
6

मेरे पास 10-20 मिलियन पंक्तियों वाली दो तालिकाएं हैं जिनमें GUID प्राथमिक कुंजी हैं और विदेशी कुंजी के माध्यम से 12 तालिकाएं ली गई हैं। बेस टेबल में प्रत्येक में 10-20 इंडेक्स होते हैं।SQL सर्वर से संबंधित तालिका में GUID से BigInt तक प्राथमिक कुंजी को बदलने के लिए दृष्टिकोण

हम GUID से BigInt प्राथमिक कुंजी में जा रहे हैं। मैं सोच रहा हूं कि किसी के पास किसी दृष्टिकोण पर कोई सुझाव है या नहीं। अभी यह दृष्टिकोण है जिसे मैं सोच रहा हूं:

  1. शामिल सभी तालिकाओं पर सभी अनुक्रमणिका और fkeys ड्रॉप करें।
  2. जोड़ें प्रत्येक तालिका
  3. करने के लिए 'NewPrimaryKey' कॉलम दो आधार टेबल
  4. स्क्रिप्ट डेटा परिवर्तन "अद्यतन तालिका एक्स पर कुंजी पहचान बनाने, सेट NewPrimaryKey = y जहां OldPrimaryKey = z
  5. मूल PrimaryKey का नाम बदलें 'oldprimarykey'
  6. 'NewPrimaryKey' कॉलम 'PrimaryKey'
  7. स्क्रिप्ट का नाम बदलें वापस सभी अनुक्रमित और fkeys

इस प्रतीत करता है करने के लिए एक अच्छा दृष्टिकोण की तरह? क्या किसी को किसी टूल या स्क्रिप्ट के बारे में पता है जो इससे मदद करेगा?

टीडी: प्रति अतिरिक्त जानकारी संपादित की गई। यह ब्लॉग पोस्ट देखें जो GUID प्राथमिक होने पर एक दृष्टिकोण को संबोधित करता है: http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749/Default.aspx

+0

आप किस मार्ग पर जा रहे थे? आपने जो कहा है उसके शीर्ष पर, एप्लिकेशन को यह जानना होगा कि प्राथमिककी अब आपका नया डेटाटाइप है और गइड नहीं है। – user420667

उत्तर

0

यह निश्चित रूप से की तरह इस रणनीति काम करेगा लगता है - कमी छोड़ने, उन्हें नीचे से बाहर स्तंभ को बदलने (प्रकार परिवर्तन, नाम ही रहता है), और फिर बाधाओं पुनः काफी सुंदर है।

क्या अंततः GUID कॉलम ड्रॉप करने का लक्ष्य है? यदि हां, तो आप वास्तव में अंतरिक्ष को पुनः प्राप्त नहीं होगा जब तक टेबल नकल या फिर से बनाया जाता है, इसलिए हो सकता है निम्न समायोजन:

...
4.Script डेटा परिवर्तन "अद्यतन तालिका एक्स, सेट NewPrimaryKey = y जहां oldPrimaryKey = z
5. ड्रॉप 'oldprimarykey'
6.Rename 'NewPrimaryKey' कॉलम 'PrimaryKey'
7.Script वापस करने के लिए मूल PrimaryKey सभी अनुक्रमित और fkeys (इमारत क्लस्टर अनुक्रमित "पुनर्निर्माण" टेबल)
8. क्लस्टर इंडेक्स वाले सभी टेबलों के लिए, यह सुनिश्चित करने के लिए कुछ करें कि वे पुनर्निर्मित हो जाएं और उनकी जगह है पुनः दावा (इस तरह के निर्माण और फिर एक क्लस्टर सूचकांक ड्रॉप)

कहने की जरूरत नहीं है, उत्पादन पर चलने से पहले इसे एक देव बॉक्स पर परीक्षण करें!

+0

लिंक के साथ कुछ पुराने ईमेल के पीछे की ओर compat के लिए हमें दो मूल सारणी में पुरानी आईडी रखने की आवश्यकता है ताकि यदि कोई पुराना लिंक आता है तो हम इसका पता लगा सकते हैं, अन्यथा, संबंधित तालिकाओं पर हम पुराने कॉलम को छोड़ सकते हैं – BoomTownTech

3

आपका दृष्टिकोण यह है कि मैं इसे कैसे करूँगा।

क्या आपको वास्तव में बड़ी आवश्यकता है? एक नियमित 4 बाइट int 2 अरब (2,147,483,647) तक जाएगा।

int, bigint, smallint, and tinyint

+0

हम इसे 10 साल या उससे भी कम समय में मार सकते हैं .... क्या यह केवल एक अंतरिक्ष मुद्दा है या क्या एक सूचकांक इंडेक्स पर काफी बेहतर प्रदर्शन प्रदान करेगा? – BoomTownTech

+3

गाइड के लिए 16 बाइट्स (अनोखा पहचानकर्ता), या 8 बड़े के लिए, या नियमित int के लिए केवल 4 बाइट्स। यह डिस्क पर बस स्थान नहीं है, बल्कि मेमोरी कैश में भी है। साथ ही, आपको एक पृष्ठ (तेज लुकअप) पर और अधिक चाबियाँ मिलेंगी, और प्रत्येक अनुक्रमणिका में पीके शामिल है, इसलिए बेहतर छोटा होगा। –

0

मैं भी जोड़ेंगे:

सुनिश्चित करें कि आप शुरू करने से पहले एक अच्छा वर्तमान बैकअप किया हुआ है। सर्वर को एकल उपयोगकर्ता मोड में चलाने के लिए बदलें (पहले आउटेज अवधि के उपयोगकर्ताओं को सूचित करें)। आप नहीं चाहते हैं कि उपयोगकर्ता चालू होने पर डेटा दर्ज करने का प्रयास करें।