120M रिकॉर्ड की तालिका को अपडेट करने का एकमात्र समझदार तरीका SELECT
. है एक सेकंड . को पॉप्युलेट करने वाला कथन टेबल। ऐसा करते समय आपको ध्यान रखना होगा। नीचे निर्देश।
साधारण मामला
एक टेबल के लिए एक क्लस्टर इंडेक्स के बाहर, एक समय के दौरान डब्ल्यू/आउट समवर्ती डीएमएल:
SELECT *, new_col = 1 INTO clone.BaseTable FROM dbo.BaseTable
- नई तालिका पर अनुक्रमणिका, अवरोध, आदि फिर से बनाएं
- पुराने और नए w स्विच करें / स्कीमा बदलें ... स्थानांतरण।
- पुरानी तालिका छोड़ें
यदि आप क्लोन स्कीमा नहीं बना सकते हैं, तो उसी स्कीमा में एक भिन्न तालिका नाम काम करेगा। स्विच के बाद अपनी सभी बाधाओं और ट्रिगर्स (यदि लागू हो) का नाम बदलना याद रखें।
गैर-साधारण मामला
सबसे पहले, अपना BaseTable
फिर से बनाएं एक ही नाम के साथ एक अलग स्कीमा के तहत, उदाहरण के लिए clone.BaseTable
. एक अलग स्कीमा का उपयोग करने से बाद में नाम बदलने की प्रक्रिया सरल हो जाएगी।
- संकुल अनुक्रमणिका शामिल करें , यदि लागू हो। याद रखें कि प्राथमिक कुंजी और अद्वितीय बाधाओं को क्लस्टर किया जा सकता है, लेकिन जरूरी नहीं कि ऐसा हो।
- पहचान कॉलम और परिकलित कॉलम शामिल करें , यदि लागू हो।
- अपना नया INT कॉलम शामिल करें , जहां भी हो।
- शामिल न करें निम्न में से कोई:
- ट्रिगर
- विदेशी कुंजी बाधाएं
- गैर-संकुल अनुक्रमणिका/प्राथमिक कुंजियां/अद्वितीय बाधाएं
- बाधाओं या डिफ़ॉल्ट बाधाओं की जाँच करें। डिफ़ॉल्ट से बहुत फर्क नहीं पड़ता, लेकिन हम चीजों को न्यूनतम रखने की कोशिश कर रहे हैं।
फिर, अपनी सम्मिलित w/ 1000 पंक्तियों का परीक्षण करें:
-- assuming an IDENTITY column in BaseTable
SET IDENTITY_INSERT clone.BaseTable ON
GO
INSERT clone.BaseTable WITH (TABLOCK) (Col1, Col2, Col3)
SELECT TOP 1000 Col1, Col2, Col3 = -1
FROM dbo.BaseTable
GO
SET IDENTITY_INSERT clone.BaseTable OFF
परिणामों की जांच करें। अगर सब कुछ क्रम में दिखाई देता है:
- क्लोन तालिका को छोटा करें
- सुनिश्चित करें कि डेटाबेस बल्क-लॉग या साधारण पुनर्प्राप्ति मॉडल में है
- पूरा इंसर्ट करें।
इसमें कुछ समय लगेगा, लेकिन अपडेट जितना लंबा नहीं होगा। एक बार जब यह पूरा हो जाए, तो यह सुनिश्चित करने के लिए कि सब कुछ सही है, क्लोन तालिका में डेटा की जाँच करें।
फिर, सभी गैर-संकुल प्राथमिक कुंजी/अद्वितीय बाधाओं/अनुक्रमणिका और विदेशी कुंजी बाधाओं (उस क्रम में) को फिर से बनाएं। डिफ़ॉल्ट को फिर से बनाएँ और यदि लागू हो तो बाधाओं की जाँच करें। सभी ट्रिगर्स को फिर से बनाएँ। प्रत्येक बाधा, अनुक्रमणिका या ट्रिगर को एक अलग बैच में फिर से बनाएँ। उदाहरण:
ALTER TABLE clone.BaseTable ADD CONSTRAINT UQ_BaseTable UNIQUE (Col2)
GO
-- next constraint/index/trigger definition here
अंत में, dbo.BaseTable
ले जाएँ एक बैकअप स्कीमा और clone.BaseTable
. के लिए डीबीओ स्कीमा के लिए (या जहां भी आपकी टेबल रहना चाहिए)।
-- -- perform first true-up operation here, if necessary
-- EXEC clone.BaseTable_TrueUp
-- GO
-- -- create a backup schema, if necessary
-- CREATE SCHEMA backup_20100914
-- GO
BEGIN TRY
BEGIN TRANSACTION
ALTER SCHEMA backup_20100914 TRANSFER dbo.BaseTable
-- -- perform second true-up operation here, if necessary
-- EXEC clone.BaseTable_TrueUp
ALTER SCHEMA dbo TRANSFER clone.BaseTable
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() -- add more info here if necessary
ROLLBACK TRANSACTION
END CATCH
GO
यदि आपको डिस्क स्थान खाली करने की आवश्यकता है, तो आप इस समय अपनी मूल तालिका को छोड़ सकते हैं, हालांकि इसे थोड़ी देर तक रखने में समझदारी हो सकती है।
कहने की जरूरत नहीं है, यह आदर्श रूप से एक ऑफ़लाइन है कार्यवाही। यदि आपके पास इस ऑपरेशन को करते समय डेटा संशोधित करने वाले लोग हैं, तो आपको स्कीमा स्विच के साथ एक ट्रू-अप ऑपरेशन करना होगा। मैं dbo.BaseTable
. पर एक ट्रिगर बनाने की सलाह देता हूं सभी डीएमएल को एक अलग टेबल पर लॉग करने के लिए। डालने शुरू करने से पहले इस ट्रिगर को सक्षम करें। फिर उसी लेन-देन में जो आप स्कीमा स्थानांतरण करते हैं, ट्रू-अप करने के लिए लॉग तालिका का उपयोग करें। डेटा के सबसेट पर पहले इसका परीक्षण करें! डेल्टा को खराब करना आसान है।