PostgreSQL เพิ่มประสิทธิภาพการเพิ่มคอลัมน์ด้วยค่าเริ่มต้นที่ไม่ใช่ค่า NULL หรือไม่


10

เมื่อเพิ่มNOT NULLคอลัมน์ที่มีDEFAULTค่า - PostgreSQL ปรับการดำเนินการนี้ให้เหมาะสมหรือไม่

ในกรณีที่ตารางมี n แถว, คอลัมน์เปลี่ยนแปลงที่ไม่ได้รับการปรับให้เหมาะสมจะทำให้การเขียน n ของค่าเริ่มต้น - ซึ่งอาจเป็นเรื่องที่เจ็บปวดอย่างมาก ด้วยการปรับให้เหมาะสมฐานข้อมูลจะสร้างคอลัมน์ใหม่ทันทีเก็บเพียงหนึ่งสำเนาของค่าเริ่มต้นซึ่งจะถูกส่งกลับเมื่อไม่พบค่าที่ไม่ใช่ค่าเริ่มต้นสำหรับคอลัมน์นั้นในโครงสร้างข้อมูลดัชนีที่เหมาะสม

ตัวอย่างเช่นOracle 11g มีการเพิ่มประสิทธิภาพเช่นนั้น

คำตอบ:


16

ไม่มีกลไกดังกล่าวใน PostgreSQL

อย่างไรก็ตามคุณยังสามารถหลีกเลี่ยงผลกระทบที่มากเกินไปจากการเปลี่ยนแปลงตารางดังกล่าวได้

คำสั่งต่อไปนี้จะได้รับการล็อคแบบเอกสิทธิ์การเข้าถึงบนโต๊ะในช่วงเวลาของคำสั่ง / การทำธุรกรรม:

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

คำสั่งนี้เปลี่ยนแคตตาล็อกแล้วเขียนทั้งตารางใหม่เพื่อให้คอลัมน์ใหม่มีค่าเริ่มต้นในทุกแถว หากตารางมีหลายแถวและมีการเข้าถึงบ่อยครั้งเพียงพอจะทำให้เกิดปัญหาชั่วคราวบางอย่าง

ในการหลีกเลี่ยงให้ลองล็อคเอกสิทธิ์ให้สั้นที่สุดเท่าที่จะทำได้:

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

เนื่องจากนี่เป็นเพียงการเปลี่ยนแปลง (จริง ๆ สอง) ในแค็ตตาล็อก (ไม่มีการเปลี่ยนแปลงข้อมูล) มันจะเสร็จสมบูรณ์อย่างรวดเร็ว จากนั้นก็ขึ้นอยู่กับความต้องการและการใช้ตารางของคุณคุณสามารถอัปเดตคอลัมน์ใหม่ที่จะเริ่มต้นในขั้นตอนที่หนึ่งหรือใน batches NOT NULLและเมื่อเสร็จสิ้นการตั้งค่าของคอลัมน์เพื่อ

อัปเดตเกี่ยวกับความปรารถนาที่เป็นจริง: PostgreSQL 11 จะมีคุณสมบัตินี้ ดูhttps://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/สำหรับข้อมูลเพิ่มเติม


4

ใช่กับ PostgreSQL 11

ฟีเจอร์นี้เป็นของใหม่และลงจอดในเวอร์ชัน 11

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

ข้างต้นเป็นคำสั่งดังกล่าวที่จะได้รับผลกระทบจากการเพิ่มประสิทธิภาพนี้ แต่ก็ควรจะกล่าวว่าNOT NULLจะไม่จำเป็นต้องใช้ คอลัมน์ใหม่ที่เพิ่มด้วยค่าเริ่มต้นที่ไม่ใช่ศูนย์จะได้รับการปรับให้เหมาะสม คุณสามารถค้นหารายการในนี้ commitfestนอกจากนี้คุณควรตรวจสอบนี้เขียนขึ้นที่ดีเกี่ยวกับมัน"ที่หายไปเชื่อมโยงใน Postgres 11: การสร้างคอลัมน์ได้อย่างรวดเร็วด้วยค่าเริ่มต้น"

วิธีแก้ปัญหาเบื้องต้นก่อน PostgreSQL 11

หากคุณพยายามหลีกเลี่ยงการล็อคตารางแบบเอกสิทธิ์เฉพาะบุคคลบนโต๊ะให้ทำตามคำแนะนำจาก Craig Ringer

  • เพิ่มคอลัมน์ที่ไม่มี DEFAULT
  • ALTERมันเพื่อเพิ่มDEFAULTหลังจากนั้นจึงนำไปใช้กับแถวที่แทรกใหม่
  • จากนั้นเติมคอลัมน์ใหม่ในแถวที่มีอยู่โดยความก้าวหน้าชุดUPDATEs
  • เมื่อทุกแถวมีค่าที่คุณเพิ่มNOT NULLข้อ จำกัด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.