मेरे सवालों के जवाब मिलने से पहले, मैं इसके बारे में कुछ इस तरह बताऊंगा:
बयानों की संख्या और उनके द्वारा जारी किए गए कार्यों को सापेक्ष रूप में कम से कम करें।
सभी परिदृश्य मानते हैं कि आपके पास आईडी की एक तालिका है (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;