แทนที่จะสร้างตารางใหม่คุณยังสามารถแทรกแถวที่ไม่ซ้ำกันลงในตารางเดียวกันอีกครั้งได้หลังจากตัดทอนแล้ว ทำทั้งหมดในธุรกรรมเดียว
วิธีนี้มีประโยชน์เฉพาะเมื่อมีแถวจำนวนมากให้ลบจากทั่วทั้งตาราง DELETE
เพียงไม่กี่รายการที่ซ้ำกันใช้ธรรมดา
คุณพูดถึงหลายล้านแถว เพื่อให้การดำเนินการรวดเร็วคุณต้องจัดสรรบัฟเฟอร์ชั่วคราวให้เพียงพอสำหรับเซสชัน ต้องปรับการตั้งค่าก่อนที่จะใช้บัฟเฟอร์ชั่วคราวในเซสชันปัจจุบันของคุณ ค้นหาขนาดโต๊ะของคุณ:
SELECT pg_size_pretty(pg_relation_size('tbl'));
ตั้งค่าtemp_buffers
อย่างน้อยกว่านั้นเล็กน้อย
SET temp_buffers = 200MB;
BEGIN;
CREATE TEMP TABLE t_tmp AS
SELECT DISTINCT * FROM tbl
ORDER BY id;
TRUNCATE tbl;
INSERT INTO tbl
SELECT * FROM t_tmp;
COMMIT;
วิธีนี้ดีกว่าการสร้างตารางใหม่หากมีวัตถุขึ้นอยู่ มุมมองดัชนีคีย์ต่างประเทศหรือวัตถุอื่น ๆ ที่อ้างถึงตาราง TRUNCATE
ทำให้คุณเริ่มต้นด้วยกระดานชนวนสะอาดอยู่แล้ว (ไฟล์ใหม่ในพื้นหลัง) และเป็นมากเร็วกว่าDELETE FROM tbl
ด้วยโต๊ะขนาดใหญ่ ( DELETE
สามารถจริงจะได้เร็วขึ้นด้วยตารางเล็ก)
สำหรับตารางขนาดใหญ่การดร็อปดัชนีและคีย์ต่างประเทศ (FK) จะเร็วกว่าเป็นประจำเติมตารางและสร้างวัตถุเหล่านี้ใหม่ เท่าที่ข้อ จำกัด 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;
ช้ากว่าสำหรับโต๊ะใหญ่เพราะTRUNCATE
เร็วกว่า แต่อาจเร็วกว่า (และง่ายกว่า!) สำหรับโต๊ะขนาดเล็ก
หากคุณไม่มีวัตถุขึ้นอยู่เลยคุณอาจสร้างตารางใหม่และลบตารางเก่า แต่คุณแทบจะไม่ได้ประโยชน์อะไรเลยจากแนวทางสากล
สำหรับตารางขนาดใหญ่ที่ไม่พอดีกับRAM ที่มีอยู่การสร้างตารางใหม่จะเร็วกว่ามาก คุณจะต้องชั่งน้ำหนักกับปัญหา / ค่าใช้จ่ายที่อาจเกิดขึ้นกับวัตถุ