5

मुझे पहले कहना है कि एक फ्लैट फ़ाइल से 17 मिलियन रिकॉर्ड लेना, रिमोट बॉक्स पर डीबी को धक्का देना और इसमें 7 मिनट लगना अद्भुत है। एसएसआईएस वास्तव में शानदार है। लेकिन अब मेरे पास वह डेटा है, मैं डुप्लिकेट कैसे हटा सकता हूं?एसएसआईएस का उपयोग कर फ्लैट फ़ाइल से डुप्लिकेट पंक्तियों को कैसे हटाएं?

बेहतर अभी तक, मैं फ्लैट फ़ाइल लेना चाहता हूं, फ्लैट फ़ाइल से डुप्लीकेट हटा सकता हूं और उन्हें एक और फ्लैट फ़ाइल में वापस रख सकता हूं।

मैं एक के बारे में सोच रहा हूँ:

Data Flow Task

  • फ़ाइल स्रोत (एक संबद्ध फ़ाइल कनेक्शन के साथ) पाश कंटेनर
  • एक स्क्रिप्ट कंटेनर के लिए
  • एक है कि करने के लिए कुछ तर्क होता है बताएं कि क्या एक और पंक्ति मौजूद है

आपको थक गया, और इस साइट पर हर कोई अविश्वसनीय रूप से जानकार है।

Update:I have found this link, might help in answering this question

+0

जब आप "डुप्लीकेट" कहते हैं, तो क्या आपका मतलब है कि रिकॉर्ड समान हैं, या रिकॉर्ड जहां प्राथमिक कुंजी समान हैं? –

उत्तर

5

मैं करूंगा, अस्थायी तालिका के रिकॉर्ड की प्रतिलिपि बनाने के तो डुप्लिकेट जो उन्हें एक करने के लिए फ़नल चयन करने के लिए अलग या रैंक आपकी स्थिति के आधार पर चयन का उपयोग करता है भी कार्य बना लघु उद्योगों उपयोग करने का सुझाव फ्लैट फ़ाइल और उन्हें अस्थायी तालिका से हटा दें। अंतिम चरण अस्थायी तालिका से रिकॉर्ड्स को गंतव्य तालिका में कॉपी करना होगा।

डुप्लिकेट निर्धारित करना कुछ एसक्यूएल अच्छा है लेकिन एक फ्लैट फ़ाइल भी उपयुक्त नहीं है। यदि आपने प्रस्तावित किया है, तो स्क्रिप्ट कंटेनर एक पंक्ति लोड करेगा और फिर इसे 17 मिलियन रिकॉर्ड के साथ तुलना करना होगा, फिर अगली पंक्ति लोड करें और दोहराएं ... प्रदर्शन इतना बढ़िया नहीं हो सकता है।

+0

और यह तेज़ है। – thotwielder

1

रणनीति आमतौर पर इस बात पर निर्भर करेगी कि स्टेजिंग तालिका में कितने कॉलम हैं। अधिक कॉलम, समाधान जितना जटिल होगा। आपके द्वारा लिंक किया गया आलेख कुछ बहुत अच्छी सलाह है।

एकमात्र चीज जिसे मैं अब तक जो कुछ भी कहता हूं, उसमें जोड़ दूंगा, यह है कि तारीख और डेटाटाइम मूल्य वाले कॉलम यहां प्रस्तुत कुछ समाधान प्रदान करेंगे।

एक समाधान है कि मैं के साथ आया था यह है:

SET NOCOUNT ON 

DECLARE @email varchar(100) 

SET @email = '' 

SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email) 

WHILE @emailid IS NOT NULL 
BEGIN 

    -- Do INSERT statement based on the email 
    INSERT StagingTable2 (Email) 
    FROM StagingTable WITH (NOLOCK) 
    WHERE email = @email 

    SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email) 

END 

यह एक बहुत तेजी से जब deduping कर रही है, एक कर्सर की तुलना में है और सर्वर के CPU खूंटी नहीं होंगे। इसका उपयोग करने के लिए, पाठ फ़ाइल से आने वाले प्रत्येक कॉलम को अपने स्वयं के चर में अलग करें। लूप से पहले और अंदर एक अलग SELECT कथन का उपयोग करें, फिर उन्हें INSERT कथन में शामिल करें। यह मेरे लिए वास्तव में अच्छा काम किया है।

+0

हेक्टर, जब आप इस एसएसआईएस प्रयास की बात करते हैं तो आप मेरे उद्धारकर्ता होने जा रहे हैं! आपको बहुत - बहुत धन्यवाद! – RyanKeeter

+0

सेवा का होने में खुशी है। ;) –

1

फ्लैट फ़ाइल पर ऐसा करने के लिए, मैं यूनिक्स कमांड लाइन टूल, प्रकार का उपयोग करें:

sort -u inputfile > outputfile 

दुर्भाग्य से, खिड़कियों तरह आदेश एक अद्वितीय विकल्प नहीं है, लेकिन आप एक तरह से उपयोगिता डाउनलोड करने की कोशिश कर सकता है इनमें से किसी एक से:

(मैंने उन्हें आजमाया नहीं है, इसलिए कोई गारंटी नहीं है, मुझे डर है)।

दूसरी तरफ, ऐसा करने के लिए डेटाबेस में रिकॉर्ड लोड हो जाते हैं, तो आप डेटाबेस तालिका कुंजी को ignore_dup_key के साथ एक अद्वितीय अनुक्रमणिका बना सकते हैं। यह लोड समय पर रिकॉर्ड्स को बहुत ही कुशलता से अद्वितीय बना देगा।

CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY 
1

एक गंदा समाधान के बारे में थोड़ी एक समग्र महत्वपूर्ण यह है कि सभी स्तंभों तक फैला के साथ अपने लक्ष्य तालिका सेट करने के लिए है। यह विशिष्टता की विशिष्टता की गारंटी देगा। फिर डेटा गंतव्य आकार पर, त्रुटियों को अनदेखा करने के लिए कार्य को कॉन्फ़िगर करें। सभी डुप्लिकेट आवेषण विस्मरण में गिर जाएगा।

20

सॉर्ट घटक का उपयोग करें।

बस चुनें कि आप किस फ़ील्ड को अपनी लोड की गई पंक्तियों को नीचे और नीचे बाएं कोने में सॉर्ट करना चाहते हैं, आपको डुप्लिकेट को हटाने के लिए एक चेक बॉक्स दिखाई देगा। -> सकल (

1 | sample A | 
1 | sample B | 
+0

+1 यह सही उत्तर है ... –

3

फ्लैट फ़ाइल स्रोत: यह बॉक्स समस्त पंक्तियां जो प्रकार मापदंड केवल तो पंक्तियों नीचे दिए गए उदाहरण में के आधार पर डुप्लिकेट हैं डुप्लिकेट पर विचार किया जाएगा, तो हम केवल पहले मैदान पर हल कर निकाल देता है कॉलम द्वारा समूह आप अद्वितीय चाहते हैं) -> फ्लैट फ़ाइल गंतव्य

0

मैं गंतव्य सर्वर पर एक स्टेजिंग तालिका लोड करने की सलाह दूंगा और फिर परिणाम सर्वर पर एक लक्ष्य तालिका में विलय कर दूंगा। यदि आपको किसी भी स्वच्छता नियम चलाने की आवश्यकता है, तो आप इसे संग्रहीत प्रक्रिया के माध्यम से कर सकते हैं क्योंकि आप एसएसआईएस डेटा प्रवाह परिवर्तन कार्यों के मुकाबले बेहतर प्रदर्शन प्राप्त करने के लिए बाध्य हैं। इसके अलावा, deduping आमतौर पर एक बहु-चरण प्रक्रिया है। आप इस पर कटौती करना चाहेंगे:

  1. विशिष्ट रेखाएं।
  2. आदि पहला नाम की तरह कॉलम, अंतिम नाम, ईमेल पता,
  3. की अलग समूहों आप किसी मौजूदा लक्ष्य तालिका के खिलाफ डेड्यूप कर सकते हैं। यदि ऐसा है, तो आपको EXISTS या बयान में शामिल करने की आवश्यकता हो सकती है। या आप मूल पंक्ति को नए मानों के साथ अपडेट करना चाह सकते हैं। यह आम तौर पर एक मर्ज स्टेटमेंट और स्रोत के लिए एक सबक्वायरी के साथ सबसे अच्छा सेवा प्रदान की जाती है।
  4. किसी विशेष पैटर्न की पहली या अंतिम पंक्ति लें। उदाहरण के लिए, आप एक ईमेल पता या फोन नंबर की प्रत्येक घटना के लिए फ़ाइल में अंतिम पंक्ति दर्ज कर सकते हैं। मैं अनुक्रमिक क्रम उत्पन्न करने के क्रम में सीटीई के साथ ROW_NUMBER() पर भरोसा करता हूं और अनुवर्ती नमूना जैसे रिवर्स ऑर्डर कॉलम:

WITH  
    sample_records 
    (  email_address 
     , entry_date 
     , row_identifier 
    ) 
    AS 
    (
      SELECT  '[email protected]' 
        , '2009-10-08 10:00:00' 
        , 1 
     UNION ALL 

      SELECT  '[email protected]' 
        , '2009-10-08 10:00:01' 
        , 2 

     UNION ALL 

      SELECT  '[email protected]' 
        , '2009-10-08 10:00:02' 
        , 3 

     UNION ALL 

      SELECT  '[email protected]' 
        , '2009-10-08 10:00:00' 
        , 4 

     UNION ALL 

      SELECT  '[email protected]' 
        , '2009-10-08 10:00:00' 
        , 5 
    ) 
, filter_records 
    (  email_address 
     , entry_date 
     , row_identifier 
     , sequential_order 
     , reverse_order 
    ) 
    AS 
    (
     SELECT email_address 
      , entry_date 
      , row_identifier 
      , 'sequential_order' = ROW_NUMBER() OVER (
             PARTITION BY email_address 
             ORDER BY  row_identifier ASC) 
      , 'reverse_order'  = ROW_NUMBER() OVER (
             PARTITION BY email_address 
             ORDER BY  row_identifier DESC) 
     FROM sample_records 
    ) 
    SELECT  email_address 
      , entry_date 
      , row_identifier 
    FROM  filter_records 
    WHERE  reverse_order = 1 
    ORDER BY email_address; 

deduping फाइलों पर आप के लिए बहुत सारे विकल्प हैं, लेकिन अंत में मैं एक संग्रहीत प्रक्रिया में इस से निपटने की सलाह देते हैं एक बार आप गंतव्य सर्वर पर एक मचान तालिका भरी हुई है। डेटा को साफ करने के बाद, आप या तो अपने अंतिम गंतव्य में मेर्ज या इंसर्ट कर सकते हैं।

0

मिले यह पेज link text, पर देख रहे हैं लायक हो सकता है, हालांकि 17 लाख रिकॉर्ड के साथ कुछ लंबा

1

हम इस के लिए टेबल को देखने का उपयोग कर सकते लग सकता है। एसएसआईएस की तरह दो डीएफएस (डेटा फ्लो ट्रांसफॉर्मेशन) यानी फजी ग्रुपिंग और फजी लुकअप प्रदान करता है।

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