web-dev-qa-db-ja.com

postgresで日付フィールドにインデックスを付けるための推奨される方法は?

約1700万行のテーブルがいくつかあり、すべてに日付列があり、検索に頻繁に利用できるようにしたいと考えています。列にインデックスをスローして状況を確認するか、1回限りの操作としてアイテムを日付で並べ替えてから、すべてを新しいテーブルに挿入して、日付が上がるにつれて主キーが上がるようにすることを検討しています。

これらは両方ともかなり時間がかかるので、最初にここで入力を求める価値があるかもしれないと思いました。

最終的な目標は、SQLクエリをpandasにロードして、ここで関連する分析を行うことです。

7
massphoenix

日付列のインデックスは、テーブルで特定の日付を検索するときに意味があります。例:

select * from test
where the_date = '2016-01-01';
-- or

select * from test
where the_date between '2016-01-01' and '2016-01-31';
-- etc

これらのクエリでは、主キーと日付列の並べ替え順序が同じであるかどうかは関係ありません。したがって、データを新しいテーブルに書き換えても意味がありません。インデックスを作成するだけです。

ただし、インデックスをORDER BYでのみ使用する場合:

select * from test
order by the_date;

その場合、主キー整数インデックスは、日付列のインデックスよりも大幅に(2〜4倍)高速になる可能性があります。

5
klin

Postgresは、クラスター化インデックスをある程度拡張することをサポートしています。これは、データを削除して再挿入することで提案するものです。

実際、必要な順序でデータを削除して再挿入しても、クエリにかかる時間は変わりません。 Postgresはデータの順序を知りません。

テーブルのデータが変更されないことがわかっている場合。次に、作成したインデックスに基づいてデータをクラスター化します。

この操作は、インデックス内の順序に基づいてテーブルを並べ替えます。テーブルを更新するまでは非常に効果的です。構文は次のとおりです。

CLUSTER tableName USING IndexName;

詳細は マニュアル を参照してください。

また、使用することをお勧めします

explain <query>;

インデックスの前後の2つのクエリを比較します。またはクラスタリングの前後。

5
dmg