Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle से निर्दिष्ट पंक्तियों को हटाने का इष्टतम तरीका

मेरे सवालों के जवाब मिलने से पहले, मैं इसके बारे में कुछ इस तरह बताऊंगा:

बयानों की संख्या और उनके द्वारा जारी किए गए कार्यों को सापेक्ष रूप में कम से कम करें।

सभी परिदृश्य मानते हैं कि आपके पास आईडी की एक तालिका है (PURGE_IDS ) TABLE_1 . से हटाने के लिए , TABLE_2 , आदि.

वास्तव में बड़े विलोपन के लिए चयन के रूप में तालिका बनाएं का उपयोग करने पर विचार करें

यदि कोई समवर्ती गतिविधि नहीं है, और आप एक या अधिक तालिकाओं में 30+% पंक्तियों को हटा रहे हैं, तो हटाएं नहीं; create table as select . निष्पादित करें उन पंक्तियों के साथ जिन्हें आप रखना चाहते हैं, और पुरानी तालिका के लिए नई तालिका को स्वैप करें। INSERT /*+ APPEND */ ... NOLOGGING आश्चर्यजनक रूप से सस्ता है यदि आप इसे वहन कर सकते हैं। यहां तक ​​​​कि अगर आपके पास कुछ समवर्ती गतिविधि है, तो आप टेबल को फिर से बनाने के लिए ऑनलाइन टेबल रिडेफिनिशन का उपयोग करने में सक्षम हो सकते हैं।

DELETE कथन न चलाएँ जिन्हें आप जानते हैं कि इससे कोई पंक्तियाँ नहीं हटेंगी

यदि कोई आईडी मान छह तालिकाओं में से किसी एक में मौजूद है, तो ट्रैक करें कि आपने किन आईडी को हटा दिया है - और उन आईडी को किसी अन्य तालिका से हटाने का प्रयास न करें।

CREATE TABLE TABLE1_PURGE NOLOGGING
AS 
SELECT ID FROM PURGE_IDS INNER JOIN TABLE_1 ON PURGE_IDS.ID = TABLE_1.ID;

DELETE FROM TABLE1 WHERE ID IN (SELECT ID FROM TABLE1_PURGE);

DELETE FROM PURGE_IDS WHERE ID IN (SELECT ID FROM TABLE1_PURGE);

DROP TABLE TABLE1_PURGE;

और दोहराएं।

यदि आपको करना है तो Concurrency प्रबंधित करें

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

declare
  l_sql varchar2(4000);
begin
  for i in (select table_name from all_tables 
             where table_name in ('TABLE_1', 'TABLE_2', ...)
             order by table_name);
  loop
    l_sql := 'delete from ' || i.table_name || 
             ' where id in (select id from purge_ids) ' || 
             '   and rownum <= 1000000';
    loop
      commit;
      execute immediate l_sql;
      exit when sql%rowcount <> 1000000;  -- if we delete less than 1,000,000
    end loop;                             -- no more rows need to be deleted!
  end loop;
  commit;
end;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oct2014CPU, ArcGIS डेस्कटॉप को क्रैश करता है

  2. Oracle एक्सप्रेस में ट्रिगर बनाना

  3. Entity Framework के साथ स्थापना के बिना काम करने के लिए ODP.NET को परिनियोजित और कॉन्फ़िगर करना

  4. जांचें कि क्या यह Oracle में एक संख्या फ़ंक्शन है

  5. बाहरी जुड़ने वाली क्वेरी Oracle 12c में अलग तरह से व्यवहार करती है