DM SQL 排序优化

执行计划:问题SQL:查询 900w 条数据,运行 33s 左右。

复制代码
SQL> select * from test order by name desc;

执行计划:

复制代码
1   #NSET2: [375085, 900w, 1049] 
2     #PRJT2: [375085, 900w, 1049]; exp_num(30), is_atom(FALSE) 
3       #SORT3: [375085, 900w, 1049]; key_num(1), partition_key_num(0), is_distinct(FALSE), top_flag(0), is_adaptive(0)
4         #CSCN2: [3198, 900w, 1049]; INDEXxx(TEST); btr_scan(1)

ET 输出:

复制代码
NSET2	2	0%	5	1	2	0	0	0	0	NULL	NULL	0
DLCK	5	0%	4	0	1	0	0	0	0	NULL	NULL	0
PRJT2	7	0%	3	2	2	0	0	0	0	NULL	NULL	0
CSCN2	6503249	20.09%	2	4	31985	0	0	0	0	NULL	NULL	0
SORT3	25874272	79.91%	1	3	31986	30720	9827306	0	0	NULL	NULL	0

上面的数据显示,SQL 的时间主要用在排序上。

调整:去掉排序,运行 0.066s 左右。

复制代码
SQL> select * from test;

调整的执行计划:

复制代码
1   #NSET2: [3198, 900w, 1049] 
2     #PRJT2: [3198, 900w, 1049]; exp_num(30), is_atom(FALSE) 
3       #CSCN2: [3198, 900w, 1049]; INDEXxx(TEST); btr_scan(1)

调整1的ET 输出:

复制代码
NSET2	1	0.37%	4	1	2	0	0	0	0	NULL	NULL	0
DLCK	4	1.49%	2	0	1	0	0	0	0	NULL	NULL	0
PRJT2	4	1.49%	2	2	2	0	0	0	0	NULL	NULL	0
CSCN2	259	96.64%	1	3	1	0	0	0	0	NULL	NULL	0

验证了,排序是主要问题。

问题分析思路:

检查排序字段 NAME 是有索引的,但是索引的是默认的升序,而SQL 使用的是降序,所以需要耗费很久进行排序。

复制代码
CREATE OR REPLACE  INDEX "AA"."BB" ON "AA"."TEST"("NAME" ASC) 

解决办法:

将索引以降序的排列方式重建:

复制代码
CREATE OR REPLACE  INDEX "AA"."BB" ON "AA"."TEST"("NAME" DESC) 

再次执行问题SQL,运行 0.063s 左右。

重建索引后的执行计划:

复制代码
1   #NSET2: [3198, 900w, 1049] 
2     #PRJT2: [3198, 900w, 1049]; exp_num(30), is_atom(FALSE) 
3       #BLKUP2: [3198, 900w, 1049]; BB(TEST)
4         #SSCN: [3198, 900w, 1049]; BB(TEST); btr_scan(1); is_global(0)

重建索引后的ET:

复制代码
NSET2	1	0.09%	5	1	2	0	0	0	0	NULL	NULL	0
PRJT2	4	0.37%	4	2	2	0	0	0	0	NULL	NULL	0
DLCK	6	0.56%	3	0	1	0	0	0	0	NULL	NULL	0
SSCN	29	2.69%	2	4	1	0	0	0	0	NULL	NULL	0
BLKUP2	1037	96.29%	1	3	2	0	0	0	0	NULL	NULL	0

欢迎访问达梦技术分享社区 ECO

https://eco.dameng.com

相关推荐
liwenzhen20052 小时前
DM SQL 排序优化-消除排序
排序·sort·dm
liwenzhen20055 天前
DM 修改dm.ini 参数
dm·dm.ini·达梦数据库参数文件
liwenzhen20055 天前
DM 使用DBMS_SQLTUNE 系统包查看SQL 执行计划
执行计划·dm·dbms_sqltune
liwenzhen20057 天前
DM 行级锁
行级锁·dm
liwenzhen20057 天前
DM 配置 unixODBC
odbc·dm
liwenzhen200521 天前
DM 常用 HINT 参考
dm·hint
liwenzhen200521 天前
DMDRS 配置
dm·drs
liwenzhen200521 天前
DM SQL 查看执行计划
explain·执行计划·et·dm
liwenzhen200521 天前
Linux 环境编译安装 dmPython
dmpython·dm