ฉันมีตารางซึ่งจะมีประมาณ ~ 15 ล้านระเบียน ตอนนี้ฉันต้องเพิ่มดัชนีในตาราง
การเพิ่มดัชนีจะใช้เวลาในการอัปเดตทุกรายการในตาราง
ฉันค่อนข้างสับสนว่าการเพิ่มดัชนีจะทำให้ระบบหยุดทำงานหรือไม่
ถ้าใช่ฉันจะเอาชนะการหยุดทำงานได้อย่างไร
ฉันมีตารางซึ่งจะมีประมาณ ~ 15 ล้านระเบียน ตอนนี้ฉันต้องเพิ่มดัชนีในตาราง
การเพิ่มดัชนีจะใช้เวลาในการอัปเดตทุกรายการในตาราง
ฉันค่อนข้างสับสนว่าการเพิ่มดัชนีจะทำให้ระบบหยุดทำงานหรือไม่
ถ้าใช่ฉันจะเอาชนะการหยุดทำงานได้อย่างไร
คำตอบ:
ด้วยธรรมดาCREATE INDEX
ตารางจะถูกล็อคสำหรับการเขียน แต่ไม่ได้อ่าน
ใช้CREATE INDEX CONCURRENTLY
เพื่อหลีกเลี่ยงการล็อคการเขียนเช่นกัน
จากเอกสาร PostgreSQL เมื่อCREATE INDEX
:
เมื่อใช้ตัวเลือกนี้ PostgreSQL จะสร้างดัชนีโดยไม่มีการล็อกใด ๆ ที่ป้องกันการแทรกการปรับปรุงหรือการลบที่เกิดขึ้นพร้อมกัน ในขณะที่การสร้างดัชนีมาตรฐานล็อกเอาต์เขียน (แต่ไม่อ่าน) บนตารางจนกว่าจะเสร็จ ดู - มีหลายประการที่จะตระหนักถึงเมื่อใช้ตัวเลือกนี้เป็นดัชนีก่อสร้างพร้อมกัน
และเจาะจงมากขึ้น (เช่น@ypercube แสดงความคิดเห็น ):
PostgreSQL สนับสนุนการสร้างดัชนีโดยไม่ต้องล็อคออกเขียน วิธีการนี้จะเรียกโดยการระบุตัวเลือกในการ
CONCURRENTLY
CREATE INDEX
เมื่อใช้ตัวเลือกนี้ PostgreSQL จะต้องทำการสแกนสองครั้งของตารางและนอกจากนี้จะต้องรอธุรกรรมที่มีอยู่ทั้งหมดที่อาจใช้ดัชนีเพื่อยกเลิก ดังนั้นวิธีนี้ต้องใช้งานทั้งหมดมากกว่าการสร้างดัชนีมาตรฐานและใช้เวลานานกว่าจะเสร็จสมบูรณ์อย่างมีนัยสำคัญ อย่างไรก็ตามเนื่องจากจะช่วยให้การดำเนินงานปกติสามารถดำเนินต่อไปได้ในขณะที่สร้างดัชนีวิธีนี้จึงมีประโยชน์สำหรับการเพิ่มดัชนีใหม่ในสภาพแวดล้อมการผลิต
เหมืองเน้นหนัก