为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:centos7
【CPU】:x86
【问题描述】:条件查询慢
COMBAT_CLOUD> SELECT count() as value,'外国籍' as name from PAC_PERSONNEL_EXIST_INFO where PERSON_STATUS = '10'
[2024-09-04 17:11:44] [01000][111] java.sql.SQLWarning
[2024-09-04 17:11:44] 在 134 ms (execution: 100 ms, fetching: 34 ms) 内检索到从 1 开始的 1 行
COMBAT_CLOUD> SELECT count(*) as value,'外国籍' as name from PAC_PERSONNEL_EXIST_INFO where PERSON_STATUS = '10' and (REGISTERED_PLACE = '90' or REGISTERED_PLACE='900000')
[2024-09-04 17:11:49] [01000][111] java.sql.SQLWarning
[2024-09-04 17:11:49] 在 1 s 323 ms (execution: 1 s 281 ms, fetching: 42 ms) 内检索到从 1 开始的 1 行
第一个条件100毫秒,加多个条件就一秒多,加个条件性能差了很多
一.可以看一下SQL的具体耗时点
1.开启监控参数
--动态系统级内存参数,默认已开启
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
----动态会话级参数,建议当前会话开启即可,不建议参数级别开启;
SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
SP_SET_PARA_VALUE(1,'MONITOR_SQL_EXEC',1);
2.执行SQL,获取执行号
4.查看ET
授权普通用户执行et,命令如:
grant execute on et to user;
et(执行号);
二、可以尝试一下OPTIMIZER_OR_NBEXP参数的不同取值的hint
OR 表达式的优化方式。0:不优化;
1:生成 UNION_FOR_OR 操作符时,优化为无 KEY 比较方式;
2:OR 表达式优先考虑整体处理方式;
4:相关子查询的 OR 表达也优先考虑整体处理方式;
8:OR 布尔表达式的范围合并优化;
16:同一列上同时存在常量范围过滤和 IS NULL 过滤时的优化,如 C1 > 5 OR C1 IS NULL。
支持使用上述有效值的组合值,如 7 表示同时进行 1、2、4 的优化
加个HINT,查一下看看耗时是否有改善
SELECT /*+ OPTIMIZER_OR_NBEXP(2)*/count(*) as value,'外国籍' as name from PAC_PERSONNEL_EXIST_INFO where PERSON_STATUS = '10' and (REGISTERED_PLACE = '90' or REGISTERED_PLACE='900000')