在数据库的使用过程中,会用到大量的查询语句,数据库的性能问题最终都要涉及到SQL优化。所以,为了节省时间和提高效率,对一些SQL进行调优是十分必要的。
生成日志–>日志入库–>分析SQL–>优化方案
2.1、生成日志
--设置SQL过滤规则,只记录必要的SQL,生产环境不要设成1
-- 2 只记录DML语句、3 只记录DDL语句、22 记录绑定参数的语句、25 记录SQL语句和它的执行时间 、28 记录SQL语句绑定的参数信息
SELECT SF_SET_SYSTEM_PARA_VALUE('SQL_TRACE_MASK','2:3:22:25:28',0,1);
--同步日志会严重影响系统效率,生产环境必须设置为异步日志
SELECT SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_ASYNC_FLUSH',1,0,1);
--下面这个语句设置只记录执行时间超过200ms的语句
SELECT SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_MIN_EXEC_TIME',200,0,1);
--下面的语句查看设置是否生效
SELECT * FROM V$DM_INI where para_name='SVR_LOG_ASYNC_FLUSH';
SELECT * FROM V$DM_INI where para_name='SQL_TRACE_MASK';
SELECT * FROM V$DM_INI where para_name='SVR_LOG_MIN_EXEC_TIME';
--开启SQL日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 1);
--关闭SQL日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 0);
2.2、日志入库
用ETL工程将sql日志入库并用JAR包分析sql。
PS:对于比较大SQL日志(大于10G),建议采用ETL入库,入库较快
2.3、分析SQL
优化等级:并发非常高>并发一般>并发很少特别慢。
并发非常高
SQL特征:数量很少(5%),但是执行频率非常高,甚至达到每秒上百次,只要一慢,系统很可能瘫痪。
并发一般
SQL特征:占大多数(80%),如果有慢的,对系统整体稳定性影响不大,但是会造成局部的某些操作慢。
并发很少特别慢
SQL特征:数量少(15%),往往是很复杂的查询,可能一天就执行几次,对系统整体影响不大,但是优化难度很大。
2.4、优化方案
并发非常高:
1、单个SQL调到最快。 普通索引 聚集索引 覆盖索引 2、优化应用,减少执行次数。 应用做结果集缓存 优化应用逻辑,减少无用的执行
将SQL分散其他数据库节点
PS:普通索引>聚集索引、覆盖索引>优化应用,减少执行次数
并发一般:
1、使用索引 单列索引 组合索引 2、 改写SQL left join等价改为inner join 避免隐式转换不走索引
将过滤条件上拉,走索引 用分析函数,减少表扫描
在达梦数据库中,可以查看需要调整的SQL的执行计划并结合ET进行分析,来帮助寻找代价多的计划节点和操作符,指导我们进行SQL的优化。
3.1、执行计划
3.1.1、什么是达梦的执行计划
执行计划就是一条SQL语句在数据库中的执行过程或者访问路径的描述
3.1.2、如何查看执行计划
在需要查看执行计划的SQL语句前加上EXPLAIN关键字,再执行该条SQL,即可查看它的执行计划;
在达梦的管理工具中,可以选中需要查看的SQL语句,按下F9键也可以查看它的执行计划。
3.1.3、如何解读达梦的执行计划
执行计划看起来就像一棵树,执行过程为:控制流从上向下传递,数据流从下向上传递。 字段解读: 名称:计划节点的操作符
附加信息:这个操作符具体执行了什么操作 代价:该操作符花费的代价 结果集:该操作符返回的结果条数 行数据处理长度:该执行节点的字节数
描述:对该操作符的简单描述
3.2、ET
3.2.1、什么是ET
ET是达梦自带的系统存储过程,能统计SQL每个操作符的时间花费,从而定位到有性能问题的操作,指导我们去优化。
3.2.2、为什么使用ET
我们从上面的执行计划中知道了该SQL的执行过程,以及每个操作符和计划节点的代价,不过这个代价看上去还是有些抽象,ET可以把这些代价转化为具体的时间,帮助我们更好的有针对性的做出优化。
3.2.3、怎么使用ET
达梦ET默认未启用,设置启动以下三个参数可以启用ET(ENABLE_MONITOR、MONITOR_TIME和MONITOR_SQL_EXEC)。
其中,ENABLE_MONITOR和MONITOR_TIME默认已开启,如果未开启可以使用如下方法开启:
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
MONITOR_SQL_EXEC为会话级动态参数,可以设置只针对当前会话开启:
SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
执行SQL语句,我们会看到一个执行号,直接点这个执行号,即可调用ET。
3.2.4、ET结果说明
OP: 操作符 TIME(us): 时间开销,单位为微秒 PERCENT: 执行时间占总时间百分比 RANK: 执行时间耗时排序 SEQ:
执行计划节点号 N_ENTER: 进入次数