PostgreSQL 11の新機能:インクルードインデックス

画像



PostgreSQL 11のリリースは間もなく行われ、10月になります。 ただし、featurefreezeはすでに到着しています。つまり、このリリースに含まれている機能がわかっているので、masterブランチからPostgreSQL収集してテストすることができます 。 特に注目すべきは、 INCLUDEインデックスと呼ばれる機能です。 パッチは元々 アナスタシア・ルベンニコワによって書かれ、その後アレクサンダー・コロトコフヒョードル・シガエフによって完成されました 。 PostgreSQLにプッシュするのに約3年かかりました。



これらがどのような種類のインデックスであるかを理解してみましょう。 最初に、実験用のプレートを作成します。



create table test (k serial primary key, v text, ts timestamp); insert into test (v, ts) select 'key_' || s , now() from generate_series(1, 10000) as s;
      
      





...そして、その上に通常のbtreeインデックスを作成します。



 create index on test (v);
      
      





次のクエリの実行計画を見てください。



 =# explain select v, ts from test where v > 'key_1337' and v < 'key_2337'; QUERY PLAN ----------------------------------------------------------------------------- Bitmap Heap Scan on test (cost=31.57..112.09 rows=1101 width=16) Recheck Cond: ((v > 'key_1337'::text) AND (v < 'key_2337'::text)) -> Bitmap Index Scan on test_v_idx (cost=0.00..31.29 rows=1101 width=0) Index Cond: ((v > 'key_1337'::text) AND (v < 'key_2337'::text)) (4 rows)
      
      





何が起こるか見てください。 インデックスはv列に構築され、クエリではvとtsを選択するため、PostgreSQLは2ステップでクエリを実行するように強制されます。 まず、インデックスを調べて、条件を満たす行を見つけます。 それから彼は、tsを得るためにテーブルに行かなければなりません。



INCLUDEインデックスのアイデアは、クエリを直接完了するために必要なすべてのデータをインデックスに含めることです(ただし、インデックスは作成しません)。 したがって、クエリは1回のインデックススキャンで実行可能になります。



確認しましょう:



 drop index test_v_idx; create index on test (v) include (ts); explain select v, ts from test where v > 'key_1337' and v < 'key_2337';
      
      





結果:



  Index Only Scan using test_v_ts_idx on test (cost=0.29..46.30 rows=1101 width=16) Index Cond: ((v > 'key_1337'::text) AND (v < 'key_2337'::text)) (2 rows)
      
      





現在はテーブルに移動しないため、クエリは高速に動作するはずです。 ただし、実際にはすべてがデータに依存することに注意してください。 各ケースは一意であるため、ここでは意図的に合成ベンチマークを提供しません。 データボリュームでは、インクルードインデックスを使用したインデックスのみのスキャンは、通常のインデックスと同じ速度で動作することが判明する場合があります。 そして、蓄積された統計でも、クエリがヒープスキャンを行う方が速いことをPostgreSQLに伝えます。 これは、たとえば、リクエストの選択性が低い場合に発生する可能性があります。



とにかく、この機能について知っておくと便利です。PostgreSQL11に登場することを心から嬉しく思います。



All Articles