ดูเหมือนจะไม่มีวิธีทั่วไปที่ได้รับการสนับสนุน แต่มีเทคนิคบางอย่างที่อาจใช้ในบริบทที่ จำกัด เพื่อประเมินความคืบหน้าของแบบสอบถามแต่ละรายการ นี่คือบางส่วนของพวกเขา
ลำดับ
เมื่อแบบสอบถาม SELECT หรือรวมถึงการปรับปรุงใด ๆnextval(sequence_name)
หรือ INSERT มีคอลัมน์ปลายทางที่มีเป็นค่าเริ่มต้นค่าลำดับปัจจุบันสามารถสอบถามซ้ำแล้วซ้ำอีกในเซสชั่นอีกด้วยnextval
SELECT sequence_name.last_value
มันทำงานได้เพราะลำดับไม่ได้ถูกล้อมรอบด้วยการทำธุรกรรม เมื่อแผนการดำเนินการเป็นเช่นนั้นลำดับจะเพิ่มขึ้นเป็นเส้นตรงในระหว่างการสืบค้นสามารถใช้เป็นตัวบ่งชี้ความคืบหน้าได้
pgstattuple
pgstattupleโมดูล contrib ให้ฟังก์ชั่นที่สามารถมองได้โดยตรงที่หน้าข้อมูล ปรากฏว่าเมื่อใส่สิ่งอันดับลงในตารางว่างเปล่าและยังไม่ได้ส่งข้อมูลจะถูกนับในdead_tuple_count
ฟิลด์จากpgstattuple
ฟังก์ชัน
การสาธิตด้วย 9.1: สร้างตารางว่าง
CREATE TABLE tt AS (n numeric);
ลองแทรก 10M แถวเข้าไป:
INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);
ในเซสชั่นอื่นให้ตรวจสอบ pgstattuple ทุกวินาทีในระหว่างการแทรก:
$ while true;
do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
sleep 1;
done
ผล:
0
69005
520035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0
มันกลับไปที่ 0 เมื่อแทรกเสร็จแล้ว (tuples ทั้งหมดจะมองเห็นและมีชีวิตอยู่)
เคล็ดลับนี้อาจใช้เมื่อตารางไม่ได้สร้างขึ้นใหม่ แต่ค่าเริ่มต้นdead_tuple_count
น่าจะมีค่าที่ไม่เป็นศูนย์และอาจเปลี่ยนพร้อมกันหากกิจกรรมการเขียนอื่นเช่น autovacuum เกิดขึ้น (สมมุติหรือไม่ไม่แน่ใจว่าระดับของ ภาวะพร้อมกันที่คาดหวังด้วย autovacuum)
อย่างไรก็ตามมันไม่สามารถใช้ถ้าตารางถูกสร้างขึ้นโดยคำสั่งตัวเอง ( CREATE TABLE ... AS SELECT
หรือSELECT * INTO newtable
) เนื่องจากการสร้างการทำธุรกรรม วิธีแก้ปัญหาคือการสร้างตารางโดยไม่มีแถว (เพิ่มLIMIT 0
) และเติมข้อมูลในธุรกรรมถัดไป
โปรดทราบpgstattuple
ว่าไม่ได้มาฟรี: สแกนตารางทั้งหมดทุกการโทร นอกจากนี้ยัง จำกัด เฉพาะผู้ใช้ระดับสูง
เคาน์เตอร์ที่กำหนดเอง
ในบล็อกของ Pavel Stehule เขามีฟังก์ชั่นตัวนับ นำมาใช้ใน C ที่เพิ่มข้อสังเกตตามจำนวนการประหารชีวิตที่ระบุ คุณต้องรวมฟังก์ชั่นเข้ากับเคียวรีเพื่อให้ผู้ปฏิบัติการเรียกมัน การแจ้งเตือนจะถูกส่งไประหว่างการสืบค้นและไม่จำเป็นต้องแยกเซสชันเฉพาะไคลเอ็นต์ SQL ที่แสดงพวกเขา ( psql
เป็นตัวเลือกที่ชัดเจน)
ตัวอย่างของ INSERT INTO ทำใหม่เพื่อเพิ่มประกาศ:
/* transformation */
INSERT INTO destination_table
SELECT (r).*
FROM (SELECT counter(to_destination_table(_source), 1000, true) r
FROM source _source) x
คำถามที่เกี่ยวข้องกับ stackoverflow สำหรับฟังก์ชั่น:
วิธีการรายงานความคืบหน้าจากฟังก์ชั่น PostgreSQL ที่ทำงานมานานเพื่อลูกค้า
ตัวเลือกในอนาคต?
เมื่อวันที่พฤษภาคม 2017 มีการแพทช์ที่มีแนวโน้มส่งไปยังชุมชนนักพัฒนา:
[PATCH v2] คำสั่งความคืบหน้าในการตรวจสอบความคืบหน้าของการสืบค้น SQL ยาวยาว
ซึ่งอาจเป็นโซลูชันทั่วไปใน PostgreSQL 11 หรือใหม่กว่า ผู้ใช้ที่รู้สึกว่ามีส่วนร่วมในคุณสมบัติความคืบหน้าในการทำงานอาจใช้โปรแกรมปรับปรุงรุ่นล่าสุดและลองใช้PROGRESS
คำสั่งที่เสนอ
pv
คำสั่งมาก่อนและไม่ได้ติดตั้งบนเซิร์ฟเวอร์ Debian ของฉันตามค่าเริ่มต้น แต่อยู่ใน repo คำอธิบายกล่าวว่า "pv (Pipe Viewer) สามารถแทรกลงในไปป์ไลน์ปกติใด ๆ ระหว่างสองกระบวนการเพื่อให้การบ่งชี้ที่มองเห็นได้ว่าข้อมูลกำลังผ่านไปเร็วแค่ไหน" คำสั่งที่มีประโยชน์มาก!