主キーとインデックスが定義された約10mlnの行を持つテーブルがあります。
create table test.test_table(
date_info date not null,
string_data varchar(64) not null,
data bigint
primary key(date_info, string_data));
create index test_table_idx
on test.test_table(string_data);
test_table_idx
を使用するクエリがあります。
select distinct date_info from test.test_table where string_data = 'some_val';
問題は、最初にクエリを実行するのに最大20秒、その後の実行では<2秒かかる可能性があることです。
最初のアクセスでDBロード情報を取得するのではなく、インデックス全体をメモリにプルロードする方法はありますか?
追加モジュール pg_prewarm
。データベースごとに1回インストールする必要があります。見る:
インデックスだけでなく、テーブルを「ウォームアップ」することができます。インデックスに対してそれを行うには:
SELECT pg_prewarm('test.test_table_idx');
インデックスのみのスキャンを取得しない限り(手元のインデックスでしない実行します)、テーブルも事前にウォームアップすることをお勧めします。
SELECT pg_prewarm('test.test_table');
事前ウォームの対象と方法を絞り込むためのパラメーターがさらにあります。リンクをたどってください。
これはコストがかかり、システムは別の目的でキャッシュを使用した方がよい場合があります。正確なクエリが事前にわかっていて、副作用のないSELECT
の場合は、クエリを実行して、インデックスとテーブルの関連するデータページを「事前ウォーム」するだけです。
余談ですが、PKとインデックスを次のように並べ替えたほうがよい場合があります。
...
primary key(string_data, date_info);
create index test_table_idx on test.test_table(date_info);
これで、PKインデックスは、手元のクエリに対してインデックスのみのスキャンを提供できます。大きな違いが生じる可能性があります。見る: