2016-04-25 93 views
0

我使用的是PostgreSQL 9.2.8。通過時間戳檢索數據的最有效方法

我有表所示:

CREATE TABLE foo 
(
    foo_date timestamp without time zone NOT NULL, 
    -- other columns, constraints 
) 

此表包含約4,000,000行。有一天數據大約有50,000行。

我的目標是儘快檢索一天的數據。

我創建了一個索引,如:

CREATE INDEX foo_foo_date_idx 
ON foo 
USING btree 
     (date_trunc('day'::text, foo_date)); 

而現在這個樣子,我選擇數據(now()僅僅是一個例子,我需要的任何一天的數據):

select * 
from process 
where date_trunc('day'::text, now()) = date_trunc('day'::text, foo_date) 

這查詢持續約20秒。

是否有可能在更短的時間內獲得相同的數據?

+0

你的表是否有主鍵?是'foo_date'的一部分嗎? (IMO foo_date至少應該是foos候選鍵之一的一部分) – joop

+0

@joop foo包含主鍵 - 簡單的'bigint' id。 'foo_date'不是它的一部分 – ilovkatie

+0

您是否檢索這些數據並將其顯示在屏幕上?通過網絡連接獲得50,000行需要花費時間,因爲用戶界面顯示這些行。這可能不是服務器檢索這些行的問題,但瓶頸可能在其他地方。我不知道PostgreSQL工具足夠好,可以指出你可以檢查的地方,但也許別人可以。 –

回答

1

檢索50,000行需要時間。 20秒似乎很長時間,但如果行很寬,那麼這可能是一個問題。

您可以直接索引foo_date並使用不等式。所以,你可以試試這個版本:

create index foo_foo_date_idx2 on foo(foo_date); 

select p 
from process p 
where p.foo_date >= date_trunc('day', now()) and 
     p.foo_date < date_trunc('day', now() + interval '1 day'); 
相關問題