2017-05-04 8 views
0

私はこのようになりますテーブルを持っている:PostgreSQLの表には、日付の列にインデックスを使用していない

CREATE TABLE a (a_id int), (my_date date) 
CREATE INDEX idx_my_date ON a USING BTREE (my_date) 

テーブルを約140Mの行を持って、私はBETWEEN日付クエリでテーブルを照会しようとしています...と何らかの理由でmy_dateのインデックスを使用していません。

そして私は、クエリを実行しようとしています:

SELECT COUNT(*) from "a" 
where "a"."my_date" >= to_date('2017-04-28', 'YYYY-MM-DD') 
and "a"."my_date" <= to_date('2017-05-03', 'YYYY-MM-DD'); 

Aggregate (cost=4666237.99..4666238.00 rows=1 width=8) 
    Seq Scan on a (cost=0.00..4314558.32 rows=140671866 width=0) 
     Filter: ((my_date >= to_date('2017-04-28'::text, 'YYYY-MM-DD'::text)) AND (my_date <= to_date('2017-05-03'::text, 'YYYY-MM-DD'::text))) 

は、私は私のインデックスを使用するには、このクエリを強制するために何かできることはありますか?

+0

私はそれの真ん中にいました.. LOL –

+0

あなたはインデックスが正しく作成されたかどうかチェックしましたか? –

+0

あなたの質問を編集し、 'explain(analyze、verbose)'の出力を追加してください。 ([**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)お願いします。[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-mayi-i-あなたがコードを実行していないときに画像のイメージをアップロードしないでください/ 285557#285557)、実行計画のインデントを保持するようにしてください。重要です –

答えて

0

seqscanを無効にすると、PostrgeSQLはindexを使用する必要があります。あなたは、クエリでこれを行うことができます。

SET ENABLE_SEQSCAN = FALSE; 

あなたはAUTOCOMMITを有効にしているので、もし、あなたがそれを無効にするか、そうのようなトランザクションのすべてをラップする必要があります、それが唯一のトランザクション内で影響することに注意してください:

BEGIN; 
    SET ENABLE_SEQSCAN = FALSE; 
    EXPLAIN ANALYZE 
    -- your query here 
COMMIT; 

しかし、これがうまくいく場合でも、クエリプランナーに別のプランを選択させるのが最適な解決策ではないので、代わりにhereの推奨事項を検討する必要があります。

関連する問題