KDOC 500: Covering Indexを試す

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

「Postgres で試した?」と聞き返せるようになるまでもしくはなぜ私は雰囲気で技術を語るのか?で、Covering Indexという見慣れない単語を見た。調べて、試す。

インデックスにINCLUDEオプションをつけることで、内容についてもキャッシュを追加できる。

オプションのINCLUDE句は非キー列としてインデックスに含める列のリストを指定します。 非キー列をインデックススキャンの検索条件に使うことはできません。また、インデックスで何であれ一意性制約や排他制約を強制する目的に対しても無視されます。 しかしながら、インデックスオンリースキャンは、インデックスエントリから値を直接得ることができるので、インデックスのテーブルを見に行く必要なく、非キー列の内容を返すことができます。 このように非キー列の追加は、そうでないとできないインデックスオンリースキャンを利用可能にします。 CREATE INDEX

CREATE TABLE users (
    tel integer,
    name1 varchar(255),
    name2 varchar(255)
);
CREATE INDEX idx_users_name1 ON users(name1) INCLUDE (tel);
CREATE INDEX idx_users_name2 ON users(name2);

-- include付き
explain
select tel from users where name1 = 'a';

-- includeなし
explain
select tel from users where name2 = 'a';
|                                                                                  |
|----------------------------------------------------------------------------------|
| > CREATE TABLE users (                                                           |
| >     tel integer,                                                               |
| >     name1 varchar(255),                                                        |
| >     name2 varchar(255)                                                         |
| > );                                                                             |
| CREATE TABLE                                                                     |
|                                                                                  |
| > CREATE INDEX idx_users_name1 ON users(name1) INCLUDE (tel);                    |
| CREATE INDEX                                                                     |
|                                                                                  |
| > CREATE INDEX idx_users_name2 ON users(name2);                                  |
| CREATE INDEX                                                                     |
|                                                                                  |
| > explain                                                                        |
| > select tel from users where name1 = 'a';                                       |
| QUERY PLAN                                                                       |
| Index Only Scan using idx_users_name1 on users  (cost=0.14..8.16 rows=1 width=4) |
| Index Cond: (name1 = 'a'::text)                                                  |
|                                                                                  |
| > explain                                                                        |
| > select tel from users where name2 = 'a';                                       |
| QUERY PLAN                                                                       |
| Index Scan using idx_users_name2 on users  (cost=0.14..8.16 rows=1 width=4)      |
| Index Cond: ((name2)::text = 'a'::text)                                          |

関連