6

delayed_job bir sorgu düzenli böyle yapar:Bu gecikme sonrası sorgu için en uygun dizin hangisi?

SELECT "delayed_jobs".* 
FROM "delayed_jobs" 
WHERE ((run_at <= '2012-05-23 15:16:43.180810' AND (locked_at IS NULL OR locked_at < '2012-05-23 11:16:43.180841') OR locked_by = 'host:foo pid:1') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 5 

Benim günlükleri yayınlanmaya çeyrek saniye sürer benim oldukça büyük DB makine raporunda. Seçili tüm sütunlarda bazı dizinler atabilirim, ancak çok sütunlu bir dizinden daha fazla performans elde edebilirim.

Bu sorgu için yapabileceğim en uygun çoklu sütun dizini nedir? Bunu benim için hesaplayabilecek araçlar var mı?

güncelleme

postgres versiyon: 9.1.3

biri mevcut endeksi:

Limit (cost=0.00..219.65 rows=5 width=1154) (actual time=0.727..0.727 rows=0 loops=1) 
    -> Index Scan using delayed_jobs_priority on delayed_jobs (cost=0.00..351.43 rows=8 width=1154) (actual time=0.725..0.725 rows=0 loops=1) 
     Filter: ((failed_at IS NULL) AND (((run_at <= '2012-05-23 18:11:03.980113'::timestamp without time zone) AND ((locked_at IS NULL) OR (locked_at < '2012-05-23 14:11:03.98014'::timestamp without time zone))) OR ((locked_by)::text = 'host:foo pid:1'::text))) 
Total runtime: 0.754 ms 
(4 rows) 
+0

Mevcut dizinler var mı? – swasheck

+1

Mevcut açık plan planı ve PG'nin hangi versiyonundasınız? – Kuberchaun

+0

@JustBob bu soruyu şu soruya ekledim: –

cevap

0

I: Öncelik, run_at

explain analyze üzerinden ("delayed_jobs_priority" adında) Bu durumda çoklu kod dizininin çok fazla kullanılmadığını düşünmeyin. Birden çok tek kolonlu dizin kullanın.

1

LIMIT yan tümcesine sahip olduğunuzdan, (priority, run_at) numaralı belgede bir filtreleme yerine bir sıralama dizini almak mümkündür.

Tablonuzdaki WHERE koşulunu karşılayan kayıt yüzdesi nedir?

+0

Plan, indeks taraması için 10 tuple bekler, ancak istatistikler yanlış olabilir. – wildplasser

+0

@Quassnoi genellikle çok küçük –

İlgili konular