2009-02-04 11 views
6

मेरे पास ~ 9 मिलियन पंक्तियों के साथ एक मास्टर टेबल A है। एक और तालिका B (समान संरचना) तालिका A से ~ 28K पंक्तियां है। तालिका A से B की सभी सामग्री को निकालने का सबसे अच्छा तरीका क्या होगा?मैं एक टेबल से दूसरे तालिका को "घटाना" कैसे कर सकता हूं?

सभी कॉलम का संयोजन (~ 10) अद्वितीय हैं। एक अद्वितीय कुंजी के रूप में रूप में कुछ भी नहीं।

उत्तर

6

यदि आपके पास पर्याप्त अधिकार हैं तो आप एक नई तालिका बना सकते हैं और उसे एक का नाम बदल सकते हैं। नई तालिका आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं:

CREATE TABLE TEMP_A AS 
SELECT * 
FROM A 
MINUS 
SELECT * 
FROM B 

यह बहुत अच्छा प्रदर्शन करना चाहिए।

3
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB) 

काम करना चाहिए। हालांकि कुछ समय ले सकता है।

+1

एक अंतर्निहित निकालने का उपयोग कर शायद 0 तेज हो जाएगा – HLGEM

+1

मेरा समाधान एक डेवलपर समाधान है। एक फैंसीपैंट डीबीए समाधान नहीं है। :- डी लेकिन मुझे और एसक्यूएल सीखना पसंद है। –

+0

किसी भी तालिका में कोई आईडी कॉलम नहीं ... – Thorsten

2

एक ही रास्ता है, बस सभी स्तंभों

delete table a 
where exists (select 1 from table b where b.Col1= a.Col1 
AND b.Col2= a.Col2 
AND b.Col3= a.Col3 
AND b.Col4= a.Col4) 
+0

+1 "एक तरफ" कहने के लिए +1, आपके वास्तविक कोड के लिए नहीं ... – gbn

+0

IMHO यह हमेशा दिया जाता है कि यह एक तरीका है। किसी भी चीज़ के लिए 17 से अधिक तरीके हमेशा होते हैं। –

+0

AFAIK एक तालिका को छोटा करने का एकमात्र तरीका है (दूसरे शब्दों में कम से कम लॉग इन डिलीवरी ऑपरेशन करना) – SQLMenace

0

वहाँ एक महत्वपूर्ण मूल्य (या मान) कि इस्तेमाल किया जा सकता है की सूची?

कुछ

तरह
DELETE a 
FROM tableA a 
INNER JOIN tableB b 
on b.id = a.id 
+0

pls को अद्यतन करने के लिए अद्यतन qn – Bajji

1
Delete t2 
from t1 
inner join t2 
    on t1.col1 = t2.col1 
    and t1.col2 = t2.col2 
    and t1.col3 = t2.col3 
    and t1.col4 = t2.col4 
    and t1.col5 = t2.col5 
    and t1.col6 = t2.col6 
    and t1.col7 = t2.col7 
    and t1.col8 = t2.col8 
    and t1.col9 = t2.col9 
    and t1.col10 = t2.col0 

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

+0

+1 देखें यह धीमा हो जाएगा ... – Thorsten

1

यदि ऐसा कुछ है तो आपको नियमित आधार पर करना होगा, पहली पसंद डेटाबेस डिज़ाइन में सुधार करने की कोशिश करनी चाहिए (प्राथमिक कुंजी की तलाश करना, "जुड़ने" की स्थिति को कुछ हद तक प्राप्त करने की कोशिश करना कॉलम जितना संभव हो)।

यदि यह संभव नहीं है, तो दूसरा दूसरा विकल्प प्रत्येक कॉलम की "चयनशीलता" को समझना है (यानी प्रत्येक कॉलम में कितने "अलग" मान हैं, 'नाम' 'पते' से अधिक चुनिंदा होगा 'नर/मादा' से देश ')। बयान मेरा सुझाव था के सामान्य प्रकार इस तरह होगा:

Delete from tableA 
where exists (select * from tableB 
where tableA.colx1 = tableB.colx1 
and tableA.colx2 = tableB.colx2 
etc. and tableA.colx10 = tableB.colx10). 

विचार चयनात्मकता के क्रम में स्तंभों की सूची और colx1 पर एक सूचकांक का निर्माण करना है tableB पर, colx2 आदि। टेबलबी में कॉलम की सटीक संख्या कुछ परीक्षण & माप का परिणाम होगी। (हटाए गए कथन के बेहतर समय के साथ तालिका बी पर इंडेक्स बनाने के लिए समय ऑफसेट करें।)

यदि यह सिर्फ एक बार ऑपरेशन है, तो मैं ऊपर उल्लिखित धीमी विधियों में से एक चुनूंगा। यह संभवतः इस बारे में बहुत कुछ सोचने के प्रयास के लायक नहीं है जब आप घर जाने से पहले केवल एक बयान शुरू कर सकते हैं ...

+0

+1 पहले और अंतिम अनुच्छेदों के लिए +1। – karlgrz

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