ฉันใช้ PostgreSQL 9.1 บน Ubuntu 12.04
ฉันต้องเลือกระเบียนภายในช่วงเวลาหนึ่ง: ตารางของฉันtime_limits
มีสองtimestamp
ฟิลด์และหนึ่งinteger
คุณสมบัติ มีคอลัมน์เพิ่มเติมในตารางจริงของฉันที่ไม่เกี่ยวข้องกับแบบสอบถามนี้
create table (
start_date_time timestamp,
end_date_time timestamp,
id_phi integer,
primary key(start_date_time, end_date_time,id_phi);
ตารางนี้มีเร็กคอร์ด 2M โดยประมาณ
ข้อความค้นหาต่อไปนี้ใช้เวลามหาศาล
select * from time_limits as t
where t.id_phi=0
and t.start_date_time <= timestamp'2010-08-08 00:00:00'
and t.end_date_time >= timestamp'2010-08-08 00:05:00';
ดังนั้นฉันจึงพยายามเพิ่มดัชนีอื่น - ค่าผกผันของ PK:
create index idx_inversed on time_limits(id_phi, start_date_time, end_date_time);
ฉันได้รับความประทับใจที่ประสิทธิภาพการทำงานดีขึ้น: เวลาในการเข้าถึงระเบียนที่อยู่ตรงกลางของตารางดูเหมือนจะสมเหตุสมผลมากกว่า: อยู่ระหว่าง 40 ถึง 90 วินาที
แต่ก็ยังคงมีค่าหลายสิบวินาทีสำหรับช่วงกลางของช่วงเวลา และอีกสองครั้งเมื่อกำหนดเป้าหมายท้ายตาราง (พูดตามลำดับเหตุการณ์)
ฉันพยายามexplain analyze
เป็นครั้งแรกเพื่อรับแผนแบบสอบถามนี้:
Bitmap Heap Scan on time_limits (cost=4730.38..22465.32 rows=62682 width=36) (actual time=44.446..44.446 rows=0 loops=1)
Recheck Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
-> Bitmap Index Scan on idx_time_limits_phi_start_end (cost=0.00..4714.71 rows=62682 width=0) (actual time=44.437..44.437 rows=0 loops=1)
Index Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
Total runtime: 44.507 ms
ฉันจะทำอย่างไรเพื่อปรับการค้นหาให้เหมาะสม ท่านสามารถเข้าดูตลอดเวลาที่ใช้การสแกนสองคอลัมน์ timestamps ครั้งหนึ่งเคยมีการตั้งค่าid_phi
0
และฉันไม่เข้าใจการสแกนขนาดใหญ่ (แถว 60K!) ในการประทับเวลา พวกเขาไม่ได้จัดทำดัชนีโดยคีย์หลักและidx_inversed
ฉันเพิ่ม?
ฉันควรเปลี่ยนจากประเภทการประทับเวลาเป็นอย่างอื่นหรือไม่
ฉันได้อ่านนิดหน่อยเกี่ยวกับดัชนี GIST และ GIN ฉันรวบรวมพวกเขาจะมีประสิทธิภาพมากขึ้นในเงื่อนไขบางประการสำหรับประเภทที่กำหนดเอง มันเป็นตัวเลือกที่ทำงานได้สำหรับกรณีการใช้งานของฉัน?
explain analyze
การส่งออกเป็นเวลาที่แบบสอบถามที่จำเป็นบนเซิร์ฟเวอร์ หากเคียวรีของคุณใช้เวลา 45 วินาทีเวลาเพิ่มเติมจะถูกใช้ในการถ่ายโอนข้อมูลจากฐานข้อมูลไปยังโปรแกรมที่รันคิวรีหลังจากทั้งหมดคือ 62682 แถวและหากแต่ละแถวมีขนาดใหญ่ (เช่นมีความยาวvarchar
หรือtext
คอลัมน์) สิ่งนี้อาจส่งผลต่อเวลาการถ่ายโอน ฮวบ
rows=62682 rows
คือการวางแผนของประมาณการ แบบสอบถามส่งคืน 0 แถว (actual time=44.446..44.446 rows=0 loops=1)