2016-12-06 4 views
0

J'ai une table qui a une colonne daterange. Je veux sélectionner les lignes qui contiennent la date d'aujourd'hui.Postgresql indexant un type de plage

select * from mytable where drange @> now()::date

l'opérateur @> est vrai si gamme contains element

indexation des types de gamme est faite avec le GiST index

donc je créé un index CREATE INDEX my_idx ON mytable USING gist (drange)

mais explain select * from mytable where drange @> now()::date retourne toujours

Seq Scan on mytable (cost=0.00..1051.82 rows=26104 width=38) 
    Filter: (drange @> (now())::date) 

Répondre

1

L'indice est bon; probablement la condition n'est pas assez sélective pour PostgreSQL pour choisir l'index.

Vous pouvez réduire le paramètre random_page_cost pour que PostgreSQL décide davantage en faveur d'une analyse d'index.

Je vous suggère d'effectuer quelques essais de court avec EXPLAIN (ANALYZE) avec un schan séquentiel comme il est maintenant, puis quelques-uns avec random_page_cost ensemble à une valeur inférieure (1, 1,5 ou 2) pour faire PostgreSQL choisir index scan ou analyse d'index bitmap. Ensuite, vous verrez quelle option est la plus rapide – il pourrait être l'analyse séquentielle après tout.

Attention, l'exécution d'une requête plusieurs fois entraîne la mise en cache des blocs de données, ce qui peut conduire à des résultats irréalistes. Vous devez comparer les performances sur un cache “ froid ”, que vous pouvez simuler en redémarrant le serveur PostgreSQL (et/ou en vidant le cache du système de fichiers du système d'exploitation).