KDOC 496: Index (Only) Scanの様子を見る

この文書のステータス

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

概要

indexが使われる様子を確かめる。

まず、indexを使わないパターン。

CREATE TABLE users (
    name varchar(255),
    num integer
);
CREATE INDEX idx_users_name ON users(name);

-- indexを使わない
explain
select name from users where num = 1;
|                                                        |
|--------------------------------------------------------|
| > CREATE TABLE users (                                 |
| >     name varchar(255),                               |
| >     num integer                                      |
| > );                                                   |
| CREATE TABLE                                           |
|                                                        |
| > CREATE INDEX idx_users_name ON users(name);          |
| CREATE INDEX                                           |
|                                                        |
| > explain                                              |
| > select name from users where num = 1;                |
| QUERY PLAN                                             |
| Seq Scan on users  (cost=0.00..11.75 rows=1 width=516) |
| Filter: (num = 1)                                      |

つぎに、index scan するパターン。

CREATE TABLE users (
    id serial PRIMARY KEY,
    name varchar(255)
);
CREATE INDEX idx_users_name ON users(name);

explain
select id from users where name = 'a';
|                                                                            |
|----------------------------------------------------------------------------|
| > CREATE TABLE users (                                                     |
| >     id serial PRIMARY KEY,                                               |
| >     name varchar(255)                                                    |
| > );                                                                       |
| CREATE TABLE                                                               |
|                                                                            |
| > CREATE INDEX idx_users_name ON users(name);                              |
| CREATE INDEX                                                               |
|                                                                            |
| > explain                                                                  |
| > select id from users where name = 'a';                                   |
| QUERY PLAN                                                                 |
| Index Scan using idx_users_name on users  (cost=0.14..8.16 rows=1 width=4) |
| Index Cond: ((name)::text = 'a'::text)                                     |

index only scan するパターン。

CREATE TABLE users (
    name varchar(255),
    num integer
);
CREATE INDEX idx_users_name ON users(name);

-- indexを使う
explain
select name from users where name = 'a';
|                                                                                   |
|-----------------------------------------------------------------------------------|
| > CREATE TABLE users (                                                            |
| >     name varchar(255),                                                          |
| >     num integer                                                                 |
| > );                                                                              |
| CREATE TABLE                                                                      |
|                                                                                   |
| > CREATE INDEX idx_users_name ON users(name);                                     |
| CREATE INDEX                                                                      |
|                                                                                   |
| > explain                                                                         |
| > select name from users where name = 'a';                                        |
| QUERY PLAN                                                                        |
| Index Only Scan using idx_users_name on users  (cost=0.14..8.16 rows=1 width=516) |
| Index Cond: (name = 'a'::text)                                                    |

関連

なし。

Backlinks