2016-10-11 9 views
2

を使用していません。それはdate_trunc_indexを使用している:問合せは、私はこのようなクエリを持つインデックス

CREATE INDEX date_trunc_index 
ON foo 
USING btree 
(date_trunc('day'::text, my_date)); 

のは、このクエリは、他の機能/クエリ/ビュー内にあると私はinterval

私のクエリは次のようになります返す機能get_days()経由の日数を制御したいと仮定しましょう:

質問2番目のクエリでもうdate_trunc_indexが使用されていないのはなぜですか?それを修正する方法は?

EDIT

EXPLAIN ANALYZE用:

第一クエリ:

"Index Scan using date_trunc_index on foo f (cost=0.01..8.10 rows=1 width=8) (actual time=0.012..0.012 rows=0 loops=1)" 
" Index Cond: (date_trunc('day'::text, (('now'::cstring)::date - '597 days'::interval)) > date_trunc('day'::text, my_date))" 
"Total runtime: 0.049 ms" 

第二のクエリ:

"Seq Scan on foo f (cost=0.00..4228786.45 rows=2993719 width=8) (actual time=56384.159..56384.159 rows=0 loops=1)" 
" Filter: (date_trunc('day'::text, (('now'::cstring)::date - get_days())) > date_trunc('day'::text, my_date))" 
" Rows Removed by Filter: 8980835" 
"Total runtime: 56384.181 ms" 
+0

「EXPLAIN ANALYZE」とは何ですか? – icuken

+0

@icukenが2 'explain analyze'の結果で更新されました – ilovkatie

+4

' get_days() 'は" IMMUTABLE "または" STABLE "と宣言されていますか? –

答えて

1

Postgresが最適化するために使用されている機能の三つの重要な特徴を持っていますクエリ:不変、安定、および揮発性の関数。

最初の2つは、クエリの1回の実行中に "定数"です。つまり、オプティマイザはそれらを定数として扱うことができます。揮発性関数(random()など)は、呼び出されるたびに異なる値を返します。

これらはcreate functiondocumentationで説明されています。

関連する問題