KDOC 496: Index (Only) Scanの様子を見る
この文書のステータス
- 作成
- 2025-12-15 貴島
- レビュー
- 2025-12-15 貴島
概要
PostgreSQLで、インデックスが使われる様子を確かめる。
まず、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) |
関連
抽象。
- 必要な情報が索引だけで揃うと、本体を見に行かずに済む
関連。
- 具体例: KDOC 495: 文芸的にDB動作を検証できるようにする。を使って検証した
- 追加調査: QUERY PLANの値の意味をよくわかってないので調べる