5. Explaining Explain p.15
Index Scan 演算子
=# EXPLAIN SELECT oid FROM pg_proc WHERE oid=1;
QUERY PLAN
-----------------------------------------------------
Index Scan using pg_proc_oid_index on pg_proc
(cost=0.00..5.99 rows=1 width=4)
Index Cond: (oid = 1::oid)
• Index Condが無い場合は、ソートの代わり
として使われるインデックス順のフルスキャ
ンを表す
5
10. Explaining Explain p.16
Bitmap Scan 演算子
test=# EXPLAIN SELECT * FROM q3c,q3c as q3cs
WHERE (q3c.ipix>=q3cs.ipix-3 AND q3c.ipix<=q3cs.ipix+3)
OR (q3c.ipix>=q3cs.ipix-1000 AND q3c.ipix<=q3cs.ipix-993);
QUERY PLAN
------------------------------------------------
Nested Loop
-> Seq Scan on q3c q3cs
-> Bitmap Heap Scan on q3c
-> BitmapOr
-> Bitmap Index Scan on ipix_idx
-> Bitmap Index Scan on ipix_idx
• 8.1で追加された
• BitmapOr, BitmapAnd で複数のビットマップを合体
• リレーションの”ビットマップ“をメモリ内で作成する
10
36. Explaining Explain p.22
Append 演算子
=# EXPLAIN SELECT oid FROM pg_proc
UNION ALL SELECT oid ORDER BY pg_proc;
QUERY PLAN
--------------------------------------------------------------
Append (cost=0.00..209.88 rows=3494 width=4)
-> Seq Scan on pg_proc (cost=0.00..87.47 rows=1747 width=4)
-> Seq Scan on pg_proc (cost=0.00..87.47 rows=1747 width=4)
• UNION (ALL) によるトリガー, 継承
• 開始コスト無し
• コストは単に全ての入力の合計
36
37. Explaining Explain p.27
Function Scan 演算子
=# CREATE FUNCTION foo(integer) RETURNS SETOF integer AS
$$
select $1;
$$
LANGUAGE sql;
=# EXPLAIN SELECT * FROM foo(12);
QUERY PLAN
------------------------------------------------------------
Function Scan on foo (cost=0.00..12.50 rows=1000 width=4)
• 関数がデータをgatherするときに出てくる
• トラブルシューティングの観点からは若干ミステリアス
• 関数の中で使われているクエリについてexplainを走らせるべき
37
38. Explaining Explain p.28
SetOp 演算子
=# EXPLAIN SELECT oid FROM pg_proc INTERSECT SELECT oid FROM pg_proc;
QUERY PLAN
------------------------------------------------------------------------
SetOp Intersect (cost=415.51..432.98 rows=349 width=4)
-> Sort (cost=415.51..424.25 rows=3494 width=4)
Sort Key: oid
-> Append (cost=0.00..209.88 rows=3494 width=4)
-> Subquery Scan "*SELECT* 1" (cost=0.00..104.94 rows=1747)
-> Seq Scan on pg_proc (cost=0.00..87.47 rows=1747)
-> Subquery Scan "*SELECT* 2" (cost=0.00..104.94 rows=1747)
-> Seq Scan on pg_proc (cost=0.00..87.47 rows=1747)
• INTERSECT, INTERSECT ALL, EXCEPT,
EXCEPT ALL句のために使用される
– SetOp Intersect, Intersect All, Except, Except All
38
39. INTERSECT, EXCEPT
• INTERSECT: 両方の問い合わせ共通の行だけを返す。
A AND B
A B
• EXCEPT: 最初の結果集合にあり、
2番目の結果集合にない行だけを返す。
A-B
A B
• UNION: 両方の結果集合に存在する行と、
片方の結果集合に存在する行を返す。
A OR B
A B
39
41. Explaining Explain p.30
Seq Scan の強制
=# EXPLAIN SELECT * FROM pg_class;
QUERY PLAN
-------------------------------------------------------
Seq Scan on pg_class
(cost=100000000.00..100000006.86 rows=186 width=164)
• 始動コストに 100000000.0 を足すだけ
– /src/backend/optimizer/path/costsize.c
41
42. Explaining Explain p.31
スキャン強制, プランを変える
=# EXPLAIN ANALYZE SELECT * FROM pg_class WHERE oid > 2112;
QUERY PLAN
------------------------------------------------
Seq Scan on pg_class
(cost=0.00..7.33 rows=62 width=164)
(actual time=0.087..1.700 rows=174 loops=1)
Filter: (oid > 2112::oid)
Total runtime: 2.413 ms
=# SET enable_seqscan = off;
=# EXPLAIN ANALYZE SELECT * ORDER BY pg_class WHERE oid > 2112;
QUERY PLAN
------------------------------------------------
Index Scan using pg_class_oid_index on pg_class
(cost=0.00..22.84 rows=62 width=164)
(actual time=0.144..1.802 rows=174 loops=1)
Index Cond: (oid > 2112::oid)
Total runtime: 2.653 ms 42