Explain 执行计划
EXPLAIN 用于查看 PostgreSQL 优化器为语句选择的执行计划,是 SQL 调优的基础工具。
文法
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
-- option 可以是:
-- ANALYZE [ boolean ]
-- VERBOSE [ boolean ]
-- COSTS [ boolean ]
-- BUFFERS [ boolean ]
-- TIMING [ boolean ]
-- SUMMARY [ boolean ]
-- FORMAT { TEXT | XML | JSON | YAML }
注意事项
使用了 ANALYZE 选项时,语句会被实际执行。如执行 DML 时将对数据库进行实际操作。
避免污染数据的方式:
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
一个例子
postgres=# explain analyze select * from tbl;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on tbl (cost=0.00..144248.48 rows=10000048 width=8) (actual time=0.091..780.145 rows=10000000 loops=1)
Planning time: 0.124 ms
Execution time: 1046.394 ms
(3 rows)
- Seq Scan:顺序扫描
- cost:代价成本,启动成本..总成本
- actual:实际值
cost 计算
cost 的计算依据数据库中的统计信息及成本因子。
- 统计信息:
select * from pg_stats; - 成本因子:
# - Planner Cost Constants -
#seq_page_cost = 1.0 # measured on an arbitrary scale
random_page_cost = 1.1 # same scale as above
#cpu_tuple_cost = 0.01 # same scale as above
#cpu_index_tuple_cost = 0.005 # same scale as above
#cpu_operator_cost = 0.0025 # same scale as above
#parallel_tuple_cost = 0.1 # same scale as above
#parallel_setup_cost = 1000.0 # same scale as above
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
effective_cache_size = 666666
影响执行计划的参数设置
开关类:
enable_bitmapscan
enable_gathermerge
enable_hashagg
enable_hashjoin
enable_indexonlyscan
enable_indexscan
enable_material
enable_mergejoin
enable_nestloop
enable_seqscan
enable_sort
enable_tidscan
关联类:
from_collapse_limit
join_collapse_limit
geqo_threshold
设置方式:
- session:
set enable_bitmapscan = default; - 全局:
postgresql.conf - 用户级:
alter user postgres set enable_bitmapscan = off; - 数据库级别:
alter database postgres set enable_bitmapscan = off;
查看方式:
- session:
show enable_bitmapscan; - 用户级别:
select * from pg_user;
在日志中记录 explain 信息
通过 auto_explain 扩展可在日志中记录 explain 信息。