2013-06-29 7 views
6

हमारे पास लगभग 1.5 मिलियन रिकॉर्ड के साथ एक टेबल है। इस तालिका में विभिन्न तालिकाओं से बहुत सारे एफके संबंध हैं।SQL डेटाबेस से बहुत से रिकॉर्ड्स को कैसे हटाएं?

समस्या यह है कि 1 मिलियन रिकॉर्ड सिर्फ डुप्लिकेट जिन्हें हटाया जाना है। हम उस समय 1000 रिकॉर्ड हटाने की कोशिश करते हैं, लेकिन यह एक बहुत ही धीमी प्रक्रिया है।

मेरे मन में क्या अस्थायी रूप से रिकॉर्ड है जो एक नई तालिका में रहना है। मौजूदा एक को छेड़छाड़ करें और रिकॉर्ड्स कॉपी करें जिन्हें वापस रहना है। प्राथमिक कुंजी और अन्य तालिकाओं के सभी संबंधों को बहाल करने के साथ। तो ग्राहक पक्ष से आप कोई अंतर नहीं देख सकते हैं।

सुनिश्चित नहीं है कि यह एक कुशल तरीका है या नहीं।

यदि यह है तो मुझे इसके बुनियादी कार्यान्वयन को देखना अच्छा लगेगा, इसलिए मैं अपने मामले का पालन और आवेदन कर सकता हूं। यदि नहीं, तो मैं इसे करने का प्रभावी तरीका देखना चाहता हूं।

धन्यवाद

+1

यह एक एक बार सफाई बंद है, या अपने सिस्टम की आदत पड़ता है डुप्लिकेटिंग डेटा? – Trent

+0

क्या आपके पास कॉलम पर एक अनुक्रमणिका है जिसे आप पंक्तियों को फ़िल्टर करते हैं जिन्हें आप हटाना चाहते हैं? – Ilkka

+0

यह एक दुर्घटना है – German

उत्तर

2

हमारी कंपनी डेटाबेस में संग्रहीत अस्थायी डेटा का एक समूह है। जब हमें उनमें से एक समूह को हटाने की आवश्यकता होती है, तो हम इसे कुछ सौ पंक्तियों में विभाजित करते हैं और उन्हें एक समय में हटा देते हैं।

with topFew as (select top 100 * from table) delete topFew 

मैं आपको कुछ इस तरह सरल कोड़ा सुझाव है, और सिर्फ यह कुछ घंटों के लिए चलाते हैं: हम एक आवेदन पत्र है जिसका एकमात्र उद्देश्य जीवन में बार बार इस प्रकार की कुछ प्रश्नों को चलाने के लिए है। प्रसंस्करण करते समय किसी और चीज पर काम करें।

+0

हाँ, अच्छा बिंदु, यह तीसरे द्वारा किया जा सकता है। पार्टी एप्लिकेशन, प्रत्येक डिलीवरी ऑपरेशन को डेटाबेस में लो_प्रोरिटी ट्रांजैक्शन के रूप में भेजें, मैंने मतदान करने की कोशिश की, लेकिन सिस्टम ने आज के लिए पर्याप्त बताया: डी –

1

पंक्ति का प्रदर्शन करके तालिका में शामिल होने से हटाए जाने का प्रदर्शन सुधार किया जा सकता है। यह भी एक थोक इकट्ठा का उपयोग करके और forall

 DECLARE 

    limit_in integer; 
    CURSOR C1 is 
    Select min(b.rowid) 
     from table_name a, table_name b 
     where a.primary_key = b.primary_key; 

     TYPE C1_rec IS TABLE OF C1%ROWTYPE 
     INDEX BY PLS_INTEGER; 

    C1_record C1_rec 

    BEGIN 
    limit_in:=10000 --- Can be changed based on performance 
    OPEN C1; 
     LOOP 
     FETCH C1 BULK COLLECT INTO C1_record LIMIT limit_in; 
     FORALL indx in 1..c1_record.count 
     DELETE FROM table_name where row_id = C1_record(i); 
     commit; 
     END LOOP; 
    END; 

तालिका है हटाए जाने के लिए बच्चे टेबल है, तो एक बाधा उल्लंघन नहीं होगा कि अनुकूलित किया जा सकता है।

तो कोड के उपरोक्त टुकड़े को निष्पादित करने से पहले, यह विदेशी कुंजी बाधा को हटाने के लिए एक बेहतर विकल्प है ताकि कैस्केड को हटाया जा सके। हम डिस्काउंट कैस्केड जोड़ने के लिए बाधा को संशोधित नहीं कर सकते हैं। तो विदेशी कुंजी छोड़ दिया और नष्ट झरना के लिए निर्मित किया जाना चाहिए

ALTER child_table 
    ADD CONSTRAINT fk_name 
    foreign_key (C1) 
    references parent_table (C2) on delete cascade; 

हटाएँ झरना .. साथ ही अपने बच्चे टेबल को साफ होगा

+2

यह ओरेकल समाधान है, ओपी ने एसक्यूएल सर्वर – iruvar

+0

के साथ अपना प्रश्न टैग किया है वही अवधारणा एसक्यूएल सर्वर में भी इस्तेमाल किया जाना चाहिए। – Valli

+1

मुझे नहीं पता कि यह आसानी से अनुवाद योग्य है, मैं SQL सर्वर में 'rowid' और 'थोक संग्रह' के लिए किसी भी रेडीमेड समकक्षों से अवगत नहीं हूं – iruvar

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