【PostgreSQL】PostgreSQL优化-通用步骤-分析执行计划
一、对需要分析的SQL加上explain
explain命令:
explain(analyze true,verbose true,costs true,buffers true,timing true,format text)
例如下面的:
explain(analyze true,verbose true,costs true,buffers true,timing true,format text)
-- 下面是select语句
select * from table_a;
二、查出来的结果复制到notepad++
查出来的结果复制到notepad++,查找actual time
关键字,查找到的结果放到另外的notepad++窗口。
三、根据关键字(actual time)正则表达式拆分结果
notepad++正则表达式替换,得到actual time及后面的信息:
查找目标:(.*)actual time(.*)
其替换为:actual time\2
四、把结果复制到excel表格,计算出实际执行时间
excel表格字段
制作一个excel表格,把字段写好后,选择第一个单元格(A1),然后依次点击:开始菜单 -> 套用表格格式,选择自己喜欢的样式,生成一个能够输入一行数据后会自动填充的表格。
各字段如下:
4.1、actual time
actual time
:将上面第三步的结果复制过来
4.2、启动耗时
启动耗时
,公式如下:
=VALUE(MID(SUBSTITUTE([@[actual time]],"..","卍"),FIND("=",SUBSTITUTE([@[actual time]],"..","卍"))+1,FIND("卍",SUBSTITUTE([@[actual time]],"..","卍"))-FIND("=",SUBSTITUTE([@[actual time]],"..","卍"))-1))
4.3、结束耗时
结束耗时
,公式如下:
=VALUE(MID(SUBSTITUTE([@[actual time]],"..","卍"),FIND("卍",SUBSTITUTE([@[actual time]],"..","卍"))+1,FIND(" rows",SUBSTITUTE([@[actual time]],"..","卍"))-FIND("卍",SUBSTITUTE([@[actual time]],"..","卍"))-1))
4.4、循环次数
循环次数
,公式如下:
=VALUE(MID(SUBSTITUTE([@[actual time]],"loops=","卍"),FIND("卍",SUBSTITUTE([@[actual time]],"loops=","卍"))+1,FIND(")",SUBSTITUTE([@[actual time]],"loops=","卍"))-FIND("卍",SUBSTITUTE([@[actual time]],"loops=","卍"))-1))
4.5、总耗时(ms)
总耗时(ms)
,公式如下:
=[@结束耗时]*[@循环次数]
五、Excel中根据“总耗时(ms)”,找到耗时大的,根据A列(actual time),在执行计划里面找到相应的SQL进行优化
5.1、order by排序的字段可以添加索引加快查询速度
5.2、left join的表里面如果有带where条件的索引,关联条件一定要加上where条件的内容(如:delete_flag)
5.3、能用left join就不用inner join
left join
比
inner join
快
六、清理表(VACUUM full table_name;)
清理表(VACUUM full table_name;),会解决表膨胀带来的空间及性能问题。
VACUUM full table_name;
七、分析表(analyze table_name;)
分析表(analyze table_name;),会加快分区表的查询速度。
analyze table_name;