2016-12-06 154 views
0

我有一個表有daterange列。我想選擇包含今日日期的行。如果範圍contains elementPostgresql索引範圍類型

範圍類型的索引與GiST index

取得

select * from mytable where drange @> now()::date

@>運營商是真實的,所以我創建了一個索引CREATE INDEX my_idx ON mytable USING gist (drange)

explain select * from mytable where drange @> now()::date總是返回

Seq Scan on mytable (cost=0.00..1051.82 rows=26104 width=38) 
    Filter: (drange @> (now())::date) 

回答

1

該指數很好;可能該條件對於PostgreSQL選擇索引的選擇性不夠。

您可以降低參數random_page_cost以使PostgreSQL更傾向於索引掃描。

我建議你執行幾個測試運行具有EXPLAIN (ANALYZE)與順序schan因爲它是現在,然後用random_page_cost設置爲較低的值數(1,1.5或2),讓PostgreSQL選擇一個索引掃描位圖索引掃描。然後你會看到哪個選項是最快的–它畢竟可能是順序掃描。

請注意,多次運行查詢會導致數據塊被緩存,這可能會導致不切實際的好結果。您應該比較「冷備份的性能,您可以通過重新啓動PostgreSQL服務器(和/或清空操作系統的文件系統高速緩存)來模擬緩存。