วิธีทำตาราง postgres ขนาดใหญ่ซ้ำกันอย่างไร


29

ฉันมีตาราง postgres ขนาดใหญ่ (ข้อมูล 10GB - บันทึก 160M) ตารางเป็นแบบสแตติกและไม่มีการดำเนินการเขียนในนั้น ฉันต้องการที่จะทำซ้ำดำเนินการเขียนทำดัชนีใหม่และจากนั้นด้วยการทำธุรกรรมอย่างรวดเร็วเดียวลบเก่าและเปลี่ยนชื่อใหม่เป็นชื่อเดิม

วิธีที่เร็วที่สุดในการทำสำเนาตารางขนาดใหญ่เช่นนี้คืออะไร?

คำตอบ:


55

โดยทั่วไปวิธีที่เร็วที่สุดในการทำสำเนาตารางคือ:

CREATE TABLE table2 AS SELECT * FROM table1;

INSERT แบบขนานอาจเร็วกว่า แต่ใช้ได้เฉพาะกับระบบย่อยของดิสก์ที่รวดเร็วมาก มิฉะนั้นจะช้าลง

เมื่อคุณแก้ไขเสร็จtable2แล้วก็สามารถใช้ชื่อใหม่กับ:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

DROP TABLEคำสั่งต้องการล็อคพิเศษซึ่งมีผลต่อผู้อ่านพร้อมกันในแบบที่คุณอาจต้องการที่จะคาดว่าจะมี:

  • DROP จะรอให้การอ่านที่ค้างอยู่บนโต๊ะจากธุรกรรมอื่น ๆ เสร็จสิ้น
  • ธุรกรรมใหม่ใด ๆ ที่พยายามอ่านตารางนั้นในระหว่างนี้จะถูกรอและจากนั้นล้มเหลวเนื่องจากtable1ไม่มีต้นฉบับอยู่อีกต่อไป ข้อผิดพลาดจะมีลักษณะ "ไม่สามารถเปิดความสัมพันธ์กับ OID oid "

เพื่อหลีกเลี่ยงปัญหาที่สองคุณสามารถเปลี่ยนชื่อtable1 เป็นold_table1 แทนที่จะปล่อยมันแล้วปล่อยเฉพาะในภายหลังนอกธุรกรรมเมื่อผู้อ่านเหล่านี้ทำเสร็จแล้ว ดังนั้นลำดับข้างต้นจะกลายเป็น:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
ขอบคุณชาย นี่คือคำอธิบายที่ฉันค้นหา ขอบคุณอีกครั้ง!
Milovan Zogovic

หากมีดัชนีที่กำหนดไว้ใน table2 พวกเขาจะยังคงทำงานเมื่อตารางถูกเปลี่ยนชื่อ?
BamaPookie

1
@BamaPookie ลองดูสิ่งนี้สำหรับ schema แบบเต็มรวมถึงดัชนีข้อ จำกัด และค่าเริ่มต้นwiki.postgresql.org/wiki/Clone_schema
Timothy Vogel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.