एक नई तालिका बनाने के बजाय, आप इसे रौंदने के बाद एक ही तालिका में अद्वितीय पंक्तियों को फिर से सम्मिलित कर सकते हैं। यह सब एक लेन-देन में करें । वैकल्पिक रूप से, आप लेनदेन के अंत में अस्थायी तालिका को स्वचालित रूप से छोड़ सकते हैं ON COMMIT DROP
। निचे देखो।
यह दृष्टिकोण केवल उपयोगी है जहां मेज पर सभी से हटाने के लिए बहुत सारी पंक्तियाँ हैं। बस कुछ डुप्लिकेट के लिए, एक सादे का उपयोग करें DELETE
।
आपने लाखों पंक्तियों का उल्लेख किया। ऑपरेशन को तेज़ करने के लिए आप सत्र के लिए पर्याप्त अस्थायी बफ़र्स आवंटित करना चाहते हैं । आपके मौजूदा सत्र में किसी भी अस्थायी बफर का उपयोग करने से पहले सेटिंग को समायोजित करना होगा । अपनी तालिका का आकार ज्ञात करें:
SELECT pg_size_pretty(pg_relation_size('tbl'));
temp_buffers
तदनुसार सेट करें । इन-मेमोरी प्रतिनिधित्व को थोड़ा अधिक रैम की आवश्यकता के कारण उदारतापूर्वक गोल करें।
SET temp_buffers = 200MB; -- example value
BEGIN;
-- CREATE TEMPORARY TABLE t_tmp ON COMMIT DROP AS -- drop temp table at commit
CREATE TEMPORARY TABLE t_tmp AS -- retain temp table after commit
SELECT DISTINCT * FROM tbl; -- DISTINCT folds duplicates
TRUNCATE tbl;
INSERT INTO tbl
SELECT * FROM t_tmp;
-- ORDER BY id; -- optionally "cluster" data while being at it.
COMMIT;
यदि ऑब्जेक्ट मौजूद हैं, तो यह विधि एक नई तालिका बनाने के लिए बेहतर हो सकती है। तालिका को संदर्भित करने वाले दृश्य, अनुक्रमणिका, विदेशी कुंजियाँ या अन्य वस्तुएँ। TRUNCATE
आप वैसे भी एक साफ स्लेट के साथ शुरू करते हैं (पृष्ठभूमि में नई फ़ाइल) और बड़ी तालिकाओं की तुलना में बहुत तेज है DELETE FROM tbl
( DELETE
वास्तव में बड़ी तालिकाओं के साथ तेज हो सकती है)।
बड़ी तालिकाओं के लिए, अनुक्रमित और विदेशी कुंजियों को छोड़ना, तालिका को फिर से भरना और इन वस्तुओं को फिर से बनाना नियमित रूप से तेज़ है। जहाँ तक fk बाधाओं का संबंध है, तो आपको निश्चित होना चाहिए कि नया डेटा निश्चित रूप से मान्य है या आप fk बनाने के प्रयास पर अपवाद में चलेंगे।
ध्यान दें कि TRUNCATE
की तुलना में अधिक आक्रामक लॉकिंग की आवश्यकता होती है DELETE
। यह भारी, समवर्ती भार वाली तालिकाओं के लिए एक मुद्दा हो सकता है।
तो TRUNCATE
एक विकल्प या के लिए आम तौर पर नहीं है छोटे मध्यम तालिकाओं के लिए वहाँ के साथ एक समान तकनीक है एक डेटा में सुधार करने वाले CTE (Postgres 9.1 +):
WITH del AS (DELETE FROM tbl RETURNING *)
INSERT INTO tbl
SELECT DISTINCT * FROM del;
-- ORDER BY id; -- optionally "cluster" data while being at it.
बड़ी तालिकाओं के लिए धीमी, क्योंकि TRUNCATE
वहां तेजी है। लेकिन छोटी तालिकाओं के लिए तेज (और सरल!) हो सकता है।
यदि आपके पास कोई वस्तु नहीं है, तो आप एक नई तालिका बना सकते हैं और पुरानी को हटा सकते हैं, लेकिन आप इस सार्वभौमिक दृष्टिकोण पर शायद ही कुछ हासिल कर सकते हैं।
बहुत बड़ी तालिकाओं के लिए जो उपलब्ध रैम में फिट नहीं होंगे , एक नई तालिका बनाने से काफी तेज हो जाएगा। आपको संभावित वस्तुओं / ओवरहेड पर निर्भर वस्तुओं के साथ इसका वजन करना होगा।