एक ही मूल्य के लिए 700 मिलियन पंक्तियों को अद्यतन करना


12

मुझे एक डेटा वेयरहाउस (ओरेकल) मिला है, जहां मुझे सभी 700 मिलियन पंक्तियों के लिए एक ही मूल्य के लिए एक कॉलम सेट करने की आवश्यकता है।

मेरे पास किसी व्यवस्थापक तक पहुंच या पहुँच नहीं है, इसलिए इसे मूल sql के साथ पूरा करने की आवश्यकता है और कोई अस्थायी तालिका नहीं बनाता है।

इससे भी जटिल मामला यह है कि अगर मैं सिर्फ एक साधारण अद्यतन करने की कोशिश करता हूं जहां 1 = 1 है, तो यह रीडो स्पेस से बाहर चला जाता है।

जिस तरह से मेरे पास अभी चल रहा है वह इस तरह से लूप कर रहा है:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

लेकिन मुझे पता है कि यह शायद अनुभवहीन है और एक त्वरित और अधिक सुरुचिपूर्ण समाधान होना चाहिए।


क्या टेबल का विभाजन हुआ है?
जैक कहते हैं कि

मैं ऐसा नहीं मानता। अनुक्रमणिका के एक जोड़े हैं, लेकिन उनमें से कोई भी उस कॉलम को शामिल नहीं करता है जिसे मैं अपडेट कर रहा हूं।
उल्लू

जवाबों:


4

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

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

--edit

मैं एक द्वितीयक तालिका नहीं बना पा रहा हूँ ... कुछ अनुक्रमणिकाएँ हैं, लेकिन उनमें से कोई भी उस कॉलम को शामिल नहीं करता है जिसे मैं अपडेट कर रहा हूँ।

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

--edit2

यदि आप कॉलम को जोड़ / नाम / ड्रॉप कर सकते हैं , तो आप इसे बहुत कुशलता से कर सकते हैं , लेकिन केवल 11 जी पर


1
यदि आपका डीबीए आपको ऐसा करने देता है NOLOGGING, जो हॉटस्टैंडबीस को अमान्य कर देगा।
गियुस

वास्तव में, और बाद में एक बैकअप भी एक अच्छा विचार होगा - लेकिन यह एक गोदाम है और गोदामों के nologgingलिए एक उपकरण है
जैक कहते हैं कि topanswers.xyz की कोशिश करें

मैं एक माध्यमिक तालिका बनाने में सक्षम नहीं हूं, निश्चित रूप से पहले जितना बड़ा नहीं है, भले ही केवल अस्थायी हो।
उल्लू

आपका 11g लिंक आशाजनक लग रहा था, लेकिन मुझे इसमें टिप्पणियां दिखाई देती हैं कि 60 मीटर की मेज के लिए यह हर पंक्ति के लिए मूल्य निर्धारित करने के कारण अभी भी बहुत धीमी थी। चूँकि मेरी तालिका 10x आकार की है, इसलिए उस पद्धति में सुधार नहीं हो सकता है।
12

@owook नहीं, 11g पर यह ऑपरेशन त्वरित है और प्रत्येक पंक्ति के लिए "कुछ प्रकार की तालिकाओं (उदाहरण के लिए, LOB कॉलम के बिना तालिकाओं)" के लिए मान सेट नहीं करता है । अपनी मेज के सबसेट पर इसे आज़माएँ ( create table foo as select * from bar where rownum<100000)
जैक कहते हैं कि टॉपसान्वर्स ट्राइ करें ।xyz

1

यदि आप 11g पर हैं, तो कॉलम को छोड़ दें और इसे डिफ़ॉल्ट मान के साथ NOT NULL कॉलम के रूप में जोड़ें। यह जवाबी सहज ज्ञान युक्त है, लेकिन ओरेकल तालिका की परिभाषा में डिफ़ॉल्ट मान को संग्रहीत करेगा, जो रन समय पर डिफ़ॉल्ट मान को प्रतिस्थापित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.