インデックスを作成しているのに、検索が遅いため、調査してみた。 調査といっても、EXPLAINを実行するだけだが。。。。 --- これが、オリジナル(初めに作成した命令) # EXPLAIN SELECT * FROM product WHERE f_end_date>Now() and f_start_date<now() AND f_cre_date>Now() - interval '14 days' and f_status = 1; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------- Seq Scan on product (cost=0.00..112606.68 rows=5280 width=851) Filter: ((f_end_date > now()) AND (f_start_date < now()) AND (f_cre_date > (now() - '14 days'::interval)) AND (f_status = 1)) --- f_cre_dateは、インデックスと作成しているのに、使用されていない。 固定で設定してみる。 --- # EXPLAIN SELECT * FROM product WHERE f_end_date>Now() and f_start_date<now() AND f_cre_date>'2006-10-17 15:35:09' and f_status = 1; QUERY PLAN -------------------------------------------------------------------------------------------------------- Index Scan using index_product_cre_date on product (cost=0.00..16922.89 rows=489 width=851) Index Cond: (f_cre_date > '2006-10-17 15:35:09+09'::timestamp with time zone) Filter: ((f_end_date > now()) AND (f_start_date < now()) AND (f_status = 1)) --- now()関数を使用していると、インデックスを使用しないのか、EXPLAINを実行 --- # EXPLAIN SELECT * FROM product WHERE f_end_date>Now() and f_start_date<now() and f_cre_date>Now() - interval '14 days' and f_status = 1 ORDER BY f_cre_date DESC LIMIT 18; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.00..624.28 rows=18 width=851) -> Index Scan Backward using index_product_cre_date on product (cost=0.00..183122.66 rows=5280 width=851) Index Cond: (f_cre_date > (now() - '14 days'::interval)) Filter: ((f_end_date > now()) AND (f_start_date < now()) AND (f_status = 1)) --- と、now()関数を使用している場合でも、インデックスを使用している。 簡単には、高速化はできない。(まいった。)