stackoverflow.com खोजने के बाद मुझे डुप्लिकेट को हटाने का तरीका पूछने के कई प्रश्न मिले, लेकिन उनमें से कोई भी गति को संबोधित नहीं किया।डुप्लिकेट डेटा हटाने के लिए सबसे तेज़ तकनीक
मेरे मामले में मेरे पास 10 कॉलम वाली एक तालिका है जिसमें 5 मिलियन सटीक पंक्ति डुप्लिकेट हैं। इसके अलावा, मेरे पास 10 कॉलम में से 9 में डुप्लीकेट के साथ कम से कम दस लाख अन्य पंक्तियां हैं। मेरी वर्तमान तकनीक इन 5 मिलियन पंक्तियों को हटाने के लिए (अब तक) 3 घंटे ले रही है।
-- Step 1: **This step took 13 minutes.** Insert only one of the n duplicate rows into a temp table
select
MAX(prikey) as MaxPriKey, -- identity(1, 1)
a,
b,
c,
d,
e,
f,
g,
h,
i
into #dupTemp
FROM sourceTable
group by
a,
b,
c,
d,
e,
f,
g,
h,
i
having COUNT(*) > 1
इसके बाद,
-- Step 2: **This step is taking the 3+ hours**
-- delete the row when all the non-unique columns are the same (duplicates) and
-- have a smaller prikey not equal to the max prikey
delete
from sourceTable
from sourceTable
inner join #dupTemp on
sourceTable.a = #dupTemp.a and
sourceTable.b = #dupTemp.b and
sourceTable.c = #dupTemp.c and
sourceTable.d = #dupTemp.d and
sourceTable.e = #dupTemp.e and
sourceTable.f = #dupTemp.f and
sourceTable.g = #dupTemp.g and
sourceTable.h = #dupTemp.h and
sourceTable.i = #dupTemp.i and
sourceTable.PriKey != #dupTemp.MaxPriKey
यह कैसे गति, या एक तेज़ तरीका पर कोई सुझाव: यहाँ मेरी प्रक्रिया क्या है? याद रखें मुझे इसे उन पंक्तियों के लिए फिर से चलाने की आवश्यकता होगी जो सटीक डुप्लिकेट नहीं हैं।
बहुत बहुत धन्यवाद।
अद्यतन:
मुझे 9 घंटे के निशान पर चलने से चरण 2 को रोकना पड़ा। मैंने ओएमजी पोनीज़ की विधि की कोशिश की और यह केवल 40 मिनट के बाद समाप्त हो गया। मैंने एंडोमर के बैच डिलीट के साथ अपने चरण 2 की कोशिश की, यह इसे रोकने से 9 घंटे पहले चला। अद्यतन: डुप्लिकेट के एक अलग सेट से छुटकारा पाने के लिए एक कम फ़ील्ड के साथ एक समान क्वेरी चलाएं और क्वेरी ओएमजी पोनीज़ विधि का उपयोग करके केवल 4 मिनट (8000 पंक्तियों) के लिए दौड़ गई।
मैं सीटी तकनीक को अगले मौके की कोशिश करूंगा, हालांकि, मुझे संदेह है कि ओएमजी पोनीज़ की विधि को हरा करना मुश्किल होगा।
ऊपर आपके प्रश्नों के लिए आसान अनुकूलन के एक जोड़े - आप शीर्ष क्वेरी की 'SELECT' में एक, ख, ग आदि की जरूरत नहीं है - तुम सिर्फ PriKey की जरूरत है, और होने ड्रॉप - तो , दूसरी क्वेरी में बस 'स्रोत से हटाएं जहां कहीं नहीं है (डीटी.मैक्सप्रैकी को #dupTemp डीटी से चुनें) ' –
टिप के लिए धन्यवाद। –