2012-12-14 26 views
0

我應該如何索引兩個timestamp列(即starts_atends_at),這幾乎總是會在查詢中一起使用(如starts_at >= ? AND ends_at <= ?)?爲兩列創建複合索引或爲每一列分別編制索引?索引兩個「時間戳」列的最佳方法

順便說一句,我使用的Postgres,如果它的問題:)

回答

1

如果這兩列是具有低數量含正是相同的時間戳列的真實時間戳,那確實是一個沒有用複合鍵,因爲範圍掃描無法爲第一個選擇單個值。如果字段是日期,則這可能會有所不同,因爲頻繁的日期可以與時間戳不匹配的地方匹配。它有一個小的好處,但我的經驗是,它並不是很大。

如果您使用的是足夠大且密集的數據(如果單個索引掃描需要掃描大部分索引),則查詢計劃程序可以使用多個索引,並將它們與位圖結合使用。

http://www.postgresql.org/docs/current/static/indexes-bitmap-scans.html

像往常一樣與這種類型的問題,這是值得您的數據集上運行測試。

+0

謝謝!是的,列是真實的「沒有時區的時間戳」。而具有完全相同值的行數量是可笑的低。我會嘗試使用單個索引。 –

1

這是爲了後人的緣故,因爲我看到它很久以前就回答了。這假定Postgres 9.2+。如果你有一個日期範圍,你應該使用tsrange爲您的數據類型:

create table events(
    id serial primary key, 
    name text not null unique, 
    duration tsrange not null 
); 

關於範圍的好處是你可以做一些令人驚訝的查詢與他們,您的需求,這是最好的部分:

create index idx_event_duration on events 
using GIST(duration); 

現在,您可以查詢使用特殊運營商的各種:

select * from events where 
duration @> (now() - interval '2 weeks'); 

You can read more about them here。這幾乎不能抓住他們可以做的事情的表面。

相關問題