約1700万行のテーブルがいくつかあり、すべてに日付列があり、検索に頻繁に利用できるようにしたいと考えています。列にインデックスをスローして状況を確認するか、1回限りの操作としてアイテムを日付で並べ替えてから、すべてを新しいテーブルに挿入して、日付が上がるにつれて主キーが上がるようにすることを検討しています。
これらは両方ともかなり時間がかかるので、最初にここで入力を求める価値があるかもしれないと思いました。
最終的な目標は、SQLクエリをpandasにロードして、ここで関連する分析を行うことです。
日付列のインデックスは、テーブルで特定の日付を検索するときに意味があります。例:
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倍)高速になる可能性があります。
Postgresは、クラスター化インデックスをある程度拡張することをサポートしています。これは、データを削除して再挿入することで提案するものです。
実際、必要な順序でデータを削除して再挿入しても、クエリにかかる時間は変わりません。 Postgresはデータの順序を知りません。
テーブルのデータが変更されないことがわかっている場合。次に、作成したインデックスに基づいてデータをクラスター化します。
この操作は、インデックス内の順序に基づいてテーブルを並べ替えます。テーブルを更新するまでは非常に効果的です。構文は次のとおりです。
CLUSTER tableName USING IndexName;
詳細は マニュアル を参照してください。
また、使用することをお勧めします
explain <query>;
インデックスの前後の2つのクエリを比較します。またはクラスタリングの前後。