作者:瀚高PG实验室 (Highgo PG Lab)
explain输出结果解释
下面是一个最简单的explain示例
highgo=# explain select * from emp;
QUERY PLAN
--------------------------------------------------------
Seq Scan on emp (cost=0.00..15.60 rows=560 width=116)
(1 行记录)
以上输出结果中“Seq Scan on emp”表示顺序扫描emp表,顺序扫描即全表扫描。
“(cost=0.00..15.60 rows=560 width=116)”分为三部分,解释如下
“ (cost=0.00..15.60”中“cost=”后面的两个数字,第一个数字“0.00”表示启动成本,表示返回第一行需要的cost值;第二个数字表示返回所有数据需要的cost值。
“rows=560”表示访问的行数,此处应该不是返回的行数,而是为了返回查询的行,postgresql需要访问的行数,验证如下:
highgo=# explain select * from emp where empno=7499;
QUERY PLAN
----------------------------------------------------------------------
Index Scan using emp_pkey on emp(cost=0.15..8.17 rows=1width=116)
Index Cond: (empno = 7499)
(2 行记录)
highgo=# explain select * from emp1 where empno=7499 ;
QUERY PLAN
-------------------------------------------------------
Seq Scan on emp1 (cost=0.00..17.00 rows=3 width=116)
Filter: (empno = 7499)
(2 行记录)
highgo=# select * from emp1 where empno=7499 ;
empno | ename | job | mgr | hiredate | sal | comm |deptno
-------+-------+----------+------+---------------------+---------+--------+--------
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30
(1 行记录)
以上结果中emp及emp1完全相同,emp有索引,emp1没有索引,返回同一条数据时,走索引时rows=1,走全表扫描时rows=3,两个查询返回的行数均为1行,说明此处的返回的行数应该不是真实的行数。
width=116,表示每行平均宽度为116字节。
什么是“cost”?“cost”描述一条sql语句执行的代价是多少,默认情况下取值如下:
顺序扫描一个数据库,cost值为1;随机扫描一个数据库,cost值为4;处理一个数据行的CPU,cost值为0.01;处理一个索引行的CPU,cost值为0.005;每个操作符的CPU代价为0.0025。
PostgreSQL根据上面类型计算出每条SQL的执行计划,结果不是很准确,但在多数情况下够用。
使用explain时,postgresql并不会真正执行SQL。