2006-10-31 19:16:21 (火)
インデックスを作成しているのに、検索が遅いため、調査してみた。
調査といっても、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()関数を使用している場合でも、インデックスを使用している。
簡単には、高速化はできない。(まいった。)