2014-10-16 13 views
7

हमारे पास 10 बिलियन पंक्तियों वाली एक तालिका है। यह तालिका अंतराल पर विभाजित है। एक उप-विभाजन में हमें 500 मिलियन पंक्तियों की तारीख अपडेट करने की आवश्यकता है जो मानदंडों को नए मान से मेल खाते हैं। यह निश्चित रूप से नए विभाजन या कुछ के निर्माण को प्रभावित करेगा क्योंकि तालिका उसी तारीख पर विभाजित है। क्या कोई मुझे पॉइंटर्स का पालन करने के लिए सबसे अच्छा दृष्टिकोण दे सकता है?अंतराल विभाजित तालिका में 500 मिलियन पंक्तियों के लिए कॉलम मान अपडेट करें

अग्रिम धन्यवाद!

उत्तर

0

हमम ... यदि आपके पास पर्याप्त स्थान है तो मैं अच्छी अद्यतन पंक्तियों के साथ स्रोत तालिका की "प्रतिलिपि" बनाउंगा, फिर परिणाम जांचें और इसके बाद स्रोत तालिका को छोड़ दें, अंत में "प्रतिलिपि" का नाम बदलें स्रोत के लिए। हां इसका एक लंबा निष्पादन समय है, लेकिन यह एक दर्द रहित तरीका हो सकता है, निश्चित रूप से समांतर संकेत की आवश्यकता है।

+0

क्या आप गंभीर रूप से पूरे 10 बिलियन पंक्तियों की प्रतिलिपि बनाने का सुझाव दे रहे हैं? या आप विभाजन विनिमय के बारे में बात कर रहे हैं? –

+0

हाँ, आप सही हैं, आपको अपडेट-प्रभावित विभाजनों को "प्रतिस्थापित" करने की आवश्यकता है – Thomas

1

आप विभाजन कुंजी और स्रोत पंक्तियों एक एकल (उप) विभाजन में हैं अद्यतन करने के लिए जा रहे हैं, तो उचित दृष्टिकोण मानेंगे:

  1. अद्यतन पंक्तियों के लिए एक अस्थायी तालिका बनाएं। यदि संभव हो, मक्खी पर अद्यतन प्रदर्शन

    CREATE TABLE updated_rows 
    AS 
    SELECT add_months(partition_key, 1), other_columns... 
        FROM original_table PARITION (xxx) 
    WHERE ...; 
    
  2. ड्रॉप मूल (उप) विभाजन

    ALTER TABLE original_table DROP PARTITION xxx; 
    
  3. डालें अद्यतन पंक्तियों वापस

    INSERT /*+append*/ INTO original_table 
    SELECT * FROM updated_rows; 
    

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

+0

@ इसे करने का एक अच्छा तरीका है। लेकिन एक लाख पंक्तियों के लिए सम्मिलन ऑपरेशन से नहीं हो सका। – pratikch

0

आप एक नया कॉलम (फ्लैग) 'अपडेटेड' बिट जोड़ने के लिए विचार कर सकते हैं जो कि आपकी तालिका में न्यूल (या 0, मैं नफरत करता हूं) को फ़ील्ड करता हूं, और तारीखों की आलोचनाओं का उपयोग करके आपको अपडेट करने की आवश्यकता होती है एक बार समूह के डेटा को अपडेट करने के बाद, कोम्बजन द्वारा वर्णित समूह द्वारा डेटा समूह को अपडेट कर सकते हैं, आप डेटा के अपने समूह में 'अपडेट' ध्वज के मान 1 को प्रभावित कर सकते हैं।

उदाहरण के लिए डेटा के समूह बनाकर शुरू करें, मान लें कि समूहों का क्रिटिया साल है। तो चलिए वर्ष दर साल डेटा वर्ष की शुरुआत करना शुरू करते हैं।

CREATE TABLE updated_rows AS SELECT columns... FROM original_table PARITION (2001) WHERE YEAR = 2001 ...;

2.Drop मूल (उप) विभाजन

ALTER TABLE original_table DROP PARTITION 2001;

अद्यतन पंक्तियों वापस

3.Reinsert:

  1. साल 1 के एक अस्थायी तालिका बनाएं

    INSERT /*+append*/ INTO original_table(columns....,updated) SELECT columns...,1 FROM updated_rows;

    आशा है कि यह आपको तालिका के सभी डेटा को एक बार में अपडेट होने से रोकने के लिए चरण-दर-चरण डेटा का इलाज करने में मदद करेगा। आप एक कर्सर पर विचार कर सकते हैं कि वर्षों से लूप।

+0

यह 4 दिनों पहले से [इस उत्तर] (http://stackoverflow.com/a/26474008/458741) से अलग कैसे है? – Ben

+0

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

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