PostgreSQL 9.1'i Ubuntu 12.04'te kullanıyorum.
Bir süre içinde kayıtları seçmem gerekiyor: masamın time_limits
iki timestamp
alanı ve bir integer
özelliği var. Gerçek tablomda bu sorguya dahil olmayan ilave sütunlar var.
create table (
start_date_time timestamp,
end_date_time timestamp,
id_phi integer,
primary key(start_date_time, end_date_time,id_phi);
Bu tablo yaklaşık 2M kayıt içermektedir.
Aşağıdaki gibi sorular çok fazla zaman aldı:
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';
Bu yüzden başka bir dizin eklemeye çalıştım - PK tersi:
create index idx_inversed on time_limits(id_phi, start_date_time, end_date_time);
Performansın arttığı izlenimini edindim: Masanın ortasındaki kayıtlara erişme süresi daha makul görünüyor: 40 ile 90 saniye arasında bir yerde.
Ancak, zaman aralığının ortasındaki değerler için hala birkaç on saniye. Masanın sonunu hedeflerken iki kez daha (kronolojik olarak konuşursak).
explain analyze
Bu sorgu planını almak için ilk kez denedim :
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
Depesz.com'daki sonuçlara bakın.
Aramayı optimize etmek için ne yapabilirim? Bir zaman id_phi
olarak ayarlanmış iki zaman damgası sütununu taramak için harcanan süreyi görebilirsiniz 0
. Ve zaman damgalarındaki büyük taramayı (60K satır!) Anlamıyorum. Birincil anahtar tarafından dizine idx_inversed
eklenmemişler mi, ekledim mi?
Zaman damgası türlerinden başka bir şeye geçmeli miyim?
GIST ve GIN endeksleri hakkında biraz okudum. Özel tipler için belirli şartlar üzerinde daha etkili olabileceklerini biliyorum. Kullanım davam için uygun bir seçenek mi?
explain analyze
Çıktıda bildirilen süre , sunucuda gereken sorgunun zamanıdır . Sorgu 45 saniye sürer, daha sonra ek sefer 62.682 satır var ve her satır büyükse (örneğin uzun sahiptir Sonuçta sorguyu çalıştıran programa veritabanından veri aktarımı harcanan varchar
veya text
sütunlar), bu olabilir aktarım süresini etkileyebilir şiddetle, etkili şekilde.
rows=62682 rows
planlayıcının tahminidir . Sorgu 0 satır döndürür. (actual time=44.446..44.446 rows=0 loops=1)