วิธีที่ง่ายที่สุดในการแก้ปัญหาคือการสอบถามรายละเอียดระยะเวลาจาก EXPLAIN
PostgreSQL: สำหรับสิ่งนี้คุณต้องค้นหาอย่างน้อยหนึ่งแบบสอบถามที่ไม่สมบูรณ์ แต่ใช้เวลานานกว่าที่คาดไว้ สมมุติว่าเส้นตรงนี้มีหน้าตา
delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
แทนที่จะใช้คำสั่งนั้นจริงๆคุณสามารถทำได้
begin;
explain (analyze,buffers,timing) delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
rollback;
การย้อนกลับในตอนท้ายช่วยให้สามารถรันได้โดยไม่ต้องแก้ไขฐานข้อมูลจริงๆ แต่คุณยังคงได้รับรายละเอียดเวลาที่ใช้ไป หลังจากใช้งานแล้วคุณอาจพบผลลัพธ์ที่ทริกเกอร์บางตัวทำให้เกิดความล่าช้ามาก:
...
Trigger for constraint XYZ123: time=12311.292 calls=1
...
มีหน่วยtime
เป็นมิลลิวินาที (มิลลิวินาที) ดังนั้นการตรวจสอบข้อ จำกัด นี้ใช้เวลาประมาณ 12.3 วินาที คุณต้องเพิ่มใหม่INDEX
ผ่านคอลัมน์ที่จำเป็นเพื่อให้สามารถคำนวณทริกเกอร์นี้ได้อย่างมีประสิทธิภาพ สำหรับการอ้างอิงคีย์ต่างประเทศคอลัมน์ที่อ้างอิงไปยังตารางอื่นจะต้องทำดัชนี (นั่นคือคอลัมน์ต้นฉบับไม่ใช่คอลัมน์เป้าหมาย) PostgreSQL ไม่ได้สร้างดัชนีดังกล่าวโดยอัตโนมัติสำหรับคุณและDELETE
เป็นคำถามทั่วไปที่คุณต้องการดัชนีนั้นจริงๆ เป็นผลให้คุณอาจสะสมปีของข้อมูลจนกว่าคุณจะตีกรณีที่DELETE
ช้าเกินไปเนื่องจากขาดดัชนี
เมื่อคุณแก้ไขข้อ จำกัด ดังกล่าวแล้ว (หรือสิ่งอื่น ๆ ที่ใช้เวลานานเกินไป) ให้ทำซ้ำคำสั่งในbegin
/ rollback
block เพื่อให้คุณสามารถเปรียบเทียบเวลาดำเนินการใหม่กับก่อนหน้า ดำเนินการต่อไปจนกว่าคุณจะพอใจกับเวลาตอบกลับการลบบรรทัดเดียว (ฉันได้รับข้อความค้นหาหนึ่งรายการจาก 25.6 วินาทีถึง 15 ms เพียงแค่เพิ่มดัชนีอื่น ๆ ) จากนั้นคุณสามารถดำเนินการลบให้เสร็จสมบูรณ์โดยไม่แฮ็คใด ๆ
(โปรดทราบว่าEXPLAIN
จำเป็นต้องมีแบบสอบถามที่สามารถทำให้เสร็จสมบูรณ์ได้สำเร็จฉันเคยมีปัญหาเมื่อ PostgreSQL ใช้เวลานานเกินไปในการหาว่าการลบรายการหนึ่งจะละเมิดข้อ จำกัด คีย์ต่างประเทศและในกรณีEXPLAIN
นั้นไม่สามารถใช้เพราะจะไม่ปล่อยเวลาให้ล้มเหลว ข้อความค้นหาฉันไม่ทราบวิธีการแก้ไขข้อบกพร่องด้านประสิทธิภาพในกรณีเช่นนี้)