2017-05-04 25 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

我在它的中間..大聲笑 –

+0

你檢查索引是否正確創建或沒有? –

+0

請編輯您的問題並添加'explain(analyze,verbose)'的輸出。 ([**格式化文本**](http://stackoverflow.com/help/formatting)請] [無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-mayi-i-不要上傳圖像的代碼,這樣當問一個問題/ 285557#285557),並確保你保留執行計劃的重要性 - 這很重要 –

回答

0

如果您禁用了seqscan,那麼PostrgeSQL將不得不使用索引。您可以使用查詢做到這一點:

SET ENABLE_SEQSCAN = FALSE; 

請記住,它僅影響內幕交易,因此,如果您啓用了AUTOCOMMIT,那麼你將其禁用或交易包裹一切都像這樣:

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

但是,即使這可行,強制查詢計劃員選擇另一個計劃並不是最佳解決方案,因此您應該考慮here的建議。