ฉันมีตาราง Postgres ที่มีแถวประมาณ 2.1 ล้านแถว ฉันวิ่งไปตามการอัพเดทด้านล่าง:
WITH stops AS (
SELECT id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id=stops.stop
FROM stops
WHERE master.id = stops.id;
แบบสอบถามนี้ใช้เวลา 39 ชั่วโมงในการทำงาน ฉันใช้สิ่งนี้กับโปรเซสเซอร์แล็ปท็อป Core i7 Q720 4 ตัว (จริง) RAM จำนวนมากไม่มีอะไรที่ใช้เวลาส่วนใหญ่อีกต่อไป ไม่มีข้อ จำกัด พื้นที่ HDD ตารางเพิ่งถูกดูดวิเคราะห์และทำดัชนีใหม่
ตลอดเวลาที่คิวรีรันอยู่อย่างน้อยที่สุดหลังจากการทำครั้งแรกWITH
เสร็จสิ้นการใช้งาน CPU มักจะต่ำและ HDD นั้นใช้งาน 100% ฮาร์ดดิสถูกใช้งานอย่างหนักจนแอพอื่นวิ่งช้ากว่าปกติมาก
การตั้งค่าพลังงานของแล็ปท็อปมีประสิทธิภาพสูง (Windows 7 x64)
นี่คือคำอธิบาย:
Update on master (cost=822243.22..1021456.89 rows=2060910 width=312)
CTE stops
-> WindowAgg (cost=529826.95..581349.70 rows=2060910 width=33)
-> Sort (cost=529826.95..534979.23 rows=2060910 width=33)
Sort Key: consistent.master.offense_timestamp, consistent.master.defendant_dl, consistent.master.offense_street_number, consistent.master.offense_street_name
-> Seq Scan on master (cost=0.00..144630.06 rows=2060910 width=33)
Filter: (citing_jurisdiction = 1)
-> Hash Join (cost=240893.51..440107.19 rows=2060910 width=312)
Hash Cond: (stops.id = consistent.master.id)
-> CTE Scan on stops (cost=0.00..41218.20 rows=2060910 width=48)
-> Hash (cost=139413.45..139413.45 rows=2086645 width=268)
-> Seq Scan on master (cost=0.00..139413.45 rows=2086645 width=268)
citing_jurisdiction=1
แยกออกจากแถวไม่กี่หมื่นเท่านั้น แม้จะมีWHERE
ข้อนั้นฉันยังคงทำงานมากกว่า 2 ล้านแถว
ฮาร์ดไดรฟ์นั้นเข้ารหัสด้วยไดรฟ์ทั้ง TrueCrypt 7.1a ว่าสิ่งที่ช้าลงเล็กน้อย แต่ไม่มากพอที่จะทำให้เกิดแบบสอบถามเพื่อใช้เวลาที่หลายชั่วโมง
WITH
ส่วนหนึ่งจะใช้เวลาเพียงประมาณ 3 นาทีในการทำงาน
arrest_id
ฟิลด์มีดัชนีที่สำคัญต่างประเทศไม่มี มีดัชนี 8 ตัวและกุญแจต่างประเทศ 2 ตัวในตารางนี้ เขตข้อมูลอื่น ๆ ทั้งหมดในแบบสอบถามจะถูกทำดัชนี
arrest_id
ฟิลด์ไม่มีข้อ จำกัด NOT NULL
ยกเว้น
ตารางมีทั้งหมด 32 คอลัมน์
arrest_id
เป็นประเภทตัวอักษรแม่เหล็ก (20) ฉันรู้ว่าrank()
สร้างค่าตัวเลข แต่ฉันต้องใช้ตัวอักษรที่แตกต่างกัน (20)เพราะฉันมีแถวอื่น ๆ ที่citing_jurisdiction<>1
ใช้ข้อมูลที่ไม่ใช่ตัวเลขสำหรับเขตข้อมูลนี้
ฟิลด์เป็นที่ว่างเปล่าสำหรับแถวทั้งหมดที่มีarrest_id
citing_jurisdiction=1
นี่เป็นแล็ปท็อปส่วนบุคคลระดับไฮเอนด์ (ณ 1 ปีที่ผ่านมา) ฉันเป็นผู้ใช้คนเดียว ไม่มีการสอบถามหรือการดำเนินการอื่น ๆ ที่กำลังทำงานอยู่ การล็อคดูเหมือนไม่น่าเป็นไปได้
ไม่มีทริกเกอร์ใด ๆ ในตารางนี้หรือที่อื่นใดในฐานข้อมูล
การดำเนินการอื่น ๆ ในฐานข้อมูลนี้จะไม่ใช้เวลานานเกินไป ด้วยการจัดทำดัชนีที่เหมาะสมSELECT
แบบสอบถามมักจะค่อนข้างเร็ว
Seq Scan
เป็นบิตที่น่ากลัว ...