高级DBA亲自带你学习达梦8国产数据库解决慢查询SQL语句的执行计划步骤分析与索引优化方法(达梦官方手册无此内容)
一、实际情况需求描述
现在适配国产化数据库是一个趋势,有很多项目改造成国产化的版本了,则数据量比较大的数据要迁移到达梦数据库!这个适配过程中就遇到一些慢查询语句了,直接执行的很慢,或者是直接执行死了!
笔者拿一个实际工作中遇到的例子给大家提供一个通用的索引优化的方法!
二、实际案例通用优化SQL添加索引方法讲解
(1)获取到慢查询语句
SELECT * FROM v$sql_history; #查询出历史执行语句
SQL_TEXT 记录SQL语句,我们从这个抽离出来!
以下是v$sql_history
表中一些常见列名的含义:
SQL_ID
:SQL 语句的唯一标识。SQL_TEXT
:具体的 SQL 语句内容。USER_NAME
:执行该 SQL 语句的用户名称。EXECUTE_TIME
:执行时间。CPU_TIME
:CPU 消耗时间。IO_TIME
:I/O 消耗时间。ELAPSED_TIME
:总消耗时间。PARSE_TIME
:解析时间。LOCK_TIME
:锁定时间。ROWS_PROCESSED
:处理的行数。MEMORY_USED
:使用的内存量。
(2)获取到慢查询具体SQL语句
笔者拿个级联更新语句做例子,这个SQL跑起来非常卡!
UPDATE T_USER_PROFILE up SET up.STATUS_FLAG = IFNULL(
(SELECT apr.STATUS_CODE FROM PROJECT_APPROVAL_RECORDS apr
WHERE apr.APPROVAL_STATUS = 1 AND apr.REGION_CODE = up.REGION_CODE
AND SUBSTRING_INDEX(up.PROFILE_ID, '_', -1) = apr.RECORD_ID AND up.REGION_CODE = 'R0101'
ORDER BY apr.RECORD_ID DESC LIMIT 1),
0) WHERE up.REGION_CODE = 'R0101';
(3)分析这个SQL执行计划
打开DM管理工具登录选择模式
前缀加EXPLAIN执行
得出执行计划!
更新语句示例:
UPDATE T_USER_PROFILE up SET up.STATUS_FLAG = IFNULL(
(SELECT apr.STATUS_CODE FROM PROJECT_APPROVAL_RECORDS apr
WHERE apr.APPROVAL_STATUS = 1 AND apr.REGION_CODE = up.REGION_CODE
AND SUBSTRING_INDEX(up.PROFILE_ID, '_', -1) = apr.RECORD_ID AND up.REGION_CODE = 'R0101'
ORDER BY apr.RECORD_ID DESC LIMIT 1),
0) WHERE up.REGION_CODE = 'R0101';
- #UPDATE: 更新操作开始,目标表为
T_USER_PROFILE
,类型为选择操作,mpp和hp优化选项均为0。 - #PIPE2: 数据流管道,连接后续操作。
- #PRJT2: 投影操作,准备输出两列数据,非原子操作。
- #BLKUP2: 块读取,使用
IDX_PROFILE_REGION
索引从T_USER_PROFILE
表中读取数据。 - #SSEK2: 顺序扫描索引,按升序遍历索引,范围限定在
REGION_CODE='R0101'
的记录。 - #SPL2: 分区操作,为并行处理准备,含一个关键列,无暂存。
- #PRJT2: 投影操作,准备输出一列数据,原子操作。
- #PRJT2: 再次投影,非原子操作,为下一阶段准备数据。
- #SORT3: 排序操作,根据一列排序,不区分重复,取最顶一条记录,非自适应。
- #PARALLEL: 并行扫描操作,等值匹配,一列作为键,简单模式。
- #SLCT2: 选择操作,根据条件过滤记录(如 APPROVAL_STATUS = 1, REGION_CODE = ‘R0101’ 等)。
- #CSCN2: 集群扫描操作,使用
IDX_APPROVAL_RECORDS
索引在PROJECT_APPROVAL_RECORDS
表中检索数据。
我们主要看2个表扫描过程中的索引是不是以及添加!
其实主要看执行计划中有没有用到这2个表的索引,里面
这个例子中用到了,如果没有用用到就添加一下!
增加索引的语句如下:
一般添加索引为2个表的关联字段!
CREATE INDEX IDX1__NASEN ON PROJECT_APPROVAL_RECORDS (REGION_CODE,RECORD_ID);
加完再解释,确定执行计划中已经采用你新加的索引!
三、通过达梦的自动分析软件分析出需要添加的索引
将你的慢查询语句写入这个输入框,然后看达梦的工具给你的索引建议,最终
根据工具提供的字段,批量添加索引!取 【建议创建的索引的列】!
CREATE INDEX IDX1__NASEN ON PROJECT_APPROVAL_RECORDS (建议创建的索引的列);
添加完优化工具建议索引再按上述步骤再重新查看SQL的执行计划,判断索引确实已经真正启用了!
最后再重新执行刚刚SQL看看性能上是不是已经提升了!
四、笔者简介
国内某一线知名软件公司企业认证在职员工:任JAVA高级研发工程师,大数据领域专家,数据库领域专家兼任高级DBA!10年软件开发经验!现任国内某大型软件公司大数据研发工程师、MySQL数据库DBA,软件架构师。直接参与设计国家级亿级别大数据项目!并维护真实企业级生产数据库300余个!紧急处理数据库生产事故上百起,挽回数据丢失所造成的灾难损失不计其数!并为某国家级大数据系统的技术方案(国家知识产权局颁布)专利权的第一专利发明人!