जिस कंपनी के लिए मैं काम कर रहा हूं उसके पास कुछ विशाल लॉग/जर्नल टेबल हैं जो लेनदेन के साथ हर 10 सेकंड या उससे भी अधिक समय में लिखी जा रही हैं। मैं इस तालिका में बहुत सारे डेटा को कॉपी करना चाहता हूं और उसे उस तालिका से हटा देना चाहता हूं क्योंकि लगभग 75% पुराने डेटा को संग्रह तालिका या कुछ में रखा जा सकता है, लेकिन यदि मैं यह गलत करता हूं और तालिका लॉक हो जाती है यह एक आपदा होगी।एक विशाल उत्पादन तालिका से डेटा कॉपी करना
पिछले प्रश्न में एक लड़का इस तरह से कुछ आया, मैं जानना चाहता हूं कि यह सबकुछ खराब नहीं करेगा, क्या मुझे सुरक्षित रखने के लिए पर्याप्त नोलॉक संकेत है और सभी लिखने ठीक काम कर रहे हैं? यदि नहीं, तो मुझे क्या करना चाहिए? (यह मानते हुए आप तालिका में एक DATETIME
स्तंभ है कि हर डालने पर GETDATE()
करने के लिए डिफ़ॉल्ट है)
set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = max(id)+1
from newtable
select @LastID = max(ID)
from oldtable
while @StartID < @LastID
begin
set @EndID = @StartID + 1000000
insert into newtable (FIELDS,GO,HERE)
select FIELDS,GO,HERE from oldtable (NOLOCK)
where id BETWEEN @StartID AND @EndId
set @StartID = @EndID + 1
end
set identity_insert newtable off
go
पुराने रिकॉर्ड को हटाने के लिए आपकी योजना क्या है इसके अलावा यह बहुत अच्छा है? ऐसा करने का कोई तरीका नहीं है कि बिना किसी प्रकार के लॉकिंग हो। – JNK
हाँ, मैंने सवाल को थोड़ा सा स्पष्ट किया है, तो सामान्य डीबी संचालन के रास्ते में नहीं पहुंचते समय पुराने रिकॉर्ड को हटाने का सबसे अच्छा तरीका क्या है? –