2016-04-25 18 views
0

私はPostgreSQL 9.2.8を使用しています。タイムスタンプでデータを取得する最も効率的な方法

私のようなテーブルを持っている:この表は、約4.000.000行が含まれてい

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

。ある日のデータは約50,000行です。

私の目標は、できるだけ早く1日分のデータを取得することです。

私は次のようにインデックスを作成しました:

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は少なくとも候補キーの1つでなければなりません) – joop

+0

@joop fooは主キーを含んでいます - 単純な 'bigint' id。 'foo_date'はその一部ではありません – ilovkatie

+0

このデータを取得して画面に表示していますか?ネットワーク接続を介して50,000行を取得するだけで、UIにはこれらの行が表示されるため、時間がかかることになります。これらの行を取得するサーバーでは問題にならないかもしれませんが、ボトルネックは別の場所にある可能性があります。私は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'); 
関連する問題