【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000c
【操作系统】:Linux
【CPU】: x86_64
【问题描述】*:
表数据量500万
SQL1:(MP框架分页查询封装的sql,耗时16s)
EXPLAIN SELECT *
FROM (SELECT TMP.*, ROWNUM ROW_ID
FROM (SELECT p.name,
p.idcard
FROM AIMB.ai_patient p
WHERE p.idcard IN ('DEMO00194805140201')
ORDER BY p.id asc) TMP
WHERE ROWNUM <= 100)
WHERE ROW_ID > 0;
执行计划1:
SQL2:(耗时43ms)
EXPLAIN SELECT p.name,
p.idcard
FROM AIMB.ai_patient p
WHERE p.idcard = 'DEMO00194805140201'
ORDER BY p.id asc
执行计划2:
SQL3:(耗时16s)
EXPLAIN SELECT p.name,
p.idcard
FROM AIMB.ai_patient p
WHERE p.idcard = 'DEMO00194805140201'
ORDER BY p.id asc
LIMIT 100;
执行计划3:
问题:
未做数量限制时执行计划是走了全表扫描的id索引,明明根据身份证索引查询数量就1条很快的,统计信息表、索引、列全都更新过的,还是没用。
对比实验:
另一个达梦数据库:表数据量140万
SQL1执行计划:(查询耗时38ms)
SQL2执行计划:(查询耗时33ms)
SQL3执行计划:(查询耗时37ms)
疑惑:单数据库上看感觉执行计划有问题,对比后再看是否是表数据量达到某个阈值会使执行计划变笨?
您好,在当前版本中TOP_ORDER_OPT_FLAG=0为最好选择,该参数在其他参数下对于消除排序和使用更优索引存在一定问题,如果您此时为生产环境建议可以走生产变更单修改参数,
--使用该操作全局生效
SP_SET_PARA_VALUE(1,'TOP_ORDER_OPT_FLAG',0);
--单一SQL可以使用hint注入方式操作
select /*+TOP_ORDER_OPT_FLAG(0) */ * from dual;
数据库参数调整下:
TOP_ORDER_OPT_FLAG=0
,这个优化参数从实践来看风险大于收益,个别SQL条件选择性很差的时候单独使用hint处理即可,全局建议关闭;生成环境建议做好充分测试再调整