0

非常に大きなテーブルでクエリを最適化するのに苦労しています。基本的にすべての彼らは日付によって結果セットをフィルタリングする:postgresqlで日付クエリを最適化する

次の日付インデックスを追加
SELECT FROM bigtable WHERE date >= '2015-01-01' AND date <= '2016-01-01' ORDER BY date desc; 

が実際に物事を悪化させる:

CREATE INDEX CONCURRENTLY bigtable_date_index ON bigtable(date(date)); 

つまり、インデックスなしでそれが実行に1秒ほどかかりますそれを実行するには約10秒かかります。しかし、より大きな範囲とフィルタリングでは、そのインデックスがなくても非常に遅いです。

私はpostgresql 9.4を使用しています.9.5には、ソートに役立つ改善点がいくつかあります。

この場合、BRINインデックスが役立ちますか?

+1

し、[編集]をhttp://wiki.postgresql.org/wiki/SlowQueryQuestionsをお読みくださいあなたの不足している情報を追加します。 –

+1

そして、あなたの列に 'date'という名前をつけるのではなく**強いアドバイスをしてください。 – joop

+0

これは明らかに例です@joop – brauliobo

答えて

0

インデックスを有効にするには、フィルタリングしている同じものにインデックスを付ける必要があります。この場合、フィルタリングはdateですが、インデックスがdate(date)になっているように見えるため、インデックスは使用できません。

どちらかdate(date)を使用して、テーブルをフィルタリング:

SELECT FROM bigtable 
WHERE date(date) >= '2015-01-01' AND date(date) <= '2016-01-01' 
ORDER BY date(date) desc; 

またはインデックス裸date

CREATE INDEX CONCURRENTLY bigtable_date_index ON bigtable(date);