【优化】PostgreSQL或者openGauss的SQL优化策略
- 1、在字段的子查询里面,能不用函数的尽量不用函数,改SQL
- 2、子查询改为left join
- 3、where条件的等于号左边的字段尽量不用函数,改SQL
- 4、看执行计划,分析表(ANALYZE VERBOSE 表名;)
- 5、清理表(VACUUM (VERBOSE, ANALYZE) 表名;)
- 6、看执行计划,如何看sql是否走了索引,如何加索引
- 7、高斯的优化方式,增加hint,制定表走适配的索引
- 8、PostgreSQL的改法,把单表的自动清理和自动分析表收集统计信息的因子(频率)调整为2%,即100条里面有2条更新或者删除、新增这种情况的就会触发
- 附
PostgreSQL或者openGauss的SQL优化策略 :
1、在字段的子查询里面,能不用函数的尽量不用函数,改SQL
2、子查询改为left join
3、where条件的等于号左边的字段尽量不用函数,改SQL
4、看执行计划,分析表(ANALYZE VERBOSE 表名;)
在select之前加:explain(analyze true,verbose true,costs true,buffers true,timing true,format text)
看花销cost,cost=101468.69…101470.94,前面是执行计划启动的时间,后面是实际执行时间
看执行时间(cost=0.00…101466.92 rows=60 width=550) (actual time=224.646…306.602 rows=2214 loops=1),
如果cost和actual time这两个里面的rows相差太大,这个说明表的统计信息不准,
就需要执行分析表(ANALYZE VERBOSE 表名;)
5、清理表(VACUUM (VERBOSE, ANALYZE) 表名;)
表是否很久没有清理,有死元组太多,这样影响查询速度
如何查死元组:
-- 死元组,分析时间、真空时间
select n_dead_tup
,last_vacuum,last_autovacuum
,last_analyze,last_autoanalyze
,t.*
from pg_stat_all_tables t
where schemaname='schem名'
and relname ~ '表名';
VACUUM (VERBOSE, ANALYZE) 表名; -- 真空表,不锁表,只标记需要清理
VACUUM full 表名; -- 锁表,彻底清理
6、看执行计划,如何看sql是否走了索引,如何加索引
建索引需要根据区分度高的1个或多个字段来建,区分度高的字段往前放,
区分度高的字段where条件往前放,
多表关联,大表放前面做为基表先查先过滤
Index Cond:越多越好,效率越高
7、高斯的优化方式,增加hint,制定表走适配的索引
SELECT /*+ indexscan(表名或者表别名 索引名) */* from 表名;
8、PostgreSQL的改法,把单表的自动清理和自动分析表收集统计信息的因子(频率)调整为2%,即100条里面有2条更新或者删除、新增这种情况的就会触发
alter table 表名 set(autovacuum_analyze_scale_factor=0.02);
附
Oracle优化53个规则详解
https://blog.csdn.net/tttzzzqqq2018/article/details/133875256