Ben alanlardan birini ( uploaded_at
) ayarını ekler bir sürü ile bir tablo var NULL
. Daha sonra periyodik bir görev tüm tuples'ları seçer WHERE uploaded_at IS NULL
, bunları işler ve günceller, uploaded_at
güncel tarihe ayarlar .
Tabloyu nasıl indekslemeliyim?
Anlamak gibi kısmi bir dizin kullanmanız gerektiğini anlıyorum:
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
Ya da böyle bir şey. Her zaman olan bir alan üzerinde dizin doğru ise biraz kafam karıştı NULL
. Veya bir b-ağacı dizini kullanmak doğruysa. Hash daha iyi bir fikir gibi görünüyor, ancak eski ve sıcak bekleme çoğaltması akışı ile çoğaltılmıyor. Herhangi bir tavsiye büyük mutluluk duyacağız.
Aşağıdaki endekslerle biraz deneme yaptım:
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
ve sorgu planlayıcısı her zaman foo_part
dizini seçiyor gibi görünüyor . explain analyse
ayrıca foo_part
endeks için biraz daha iyi sonuç verir :
Index Scan using foo_part on t1 (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
Index Cond: (uploaded_at IS NULL)
Total runtime: 4.060 ms
vs
Bitmap Heap Scan on t1 (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
Recheck Cond: (uploaded_at IS NULL)
-> Bitmap Index Scan on foo_part_id (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
Total runtime: 5.131 ms
id
Örneğin bir seri alan olabilir mi?