注册

分页查询SQL加上LIMIT导致错误使用索引

水果披萨 2025/06/03 258 5 已解决

【DM版本】:
image.pngDM Database Server 64 V8
DB Version: 0x7000c
【操作系统】:Linux
【CPU】: x86_64
【问题描述】*:
表数据量500万
image.png
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:
image.png
SQL2:(耗时43ms)

EXPLAIN SELECT p.name, p.idcard FROM AIMB.ai_patient p WHERE p.idcard = 'DEMO00194805140201' ORDER BY p.id asc

执行计划2:
image.png
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:
image.png
问题:
未做数量限制时执行计划是走了全表扫描的id索引,明明根据身份证索引查询数量就1条很快的,统计信息表、索引、列全都更新过的,还是没用。

对比实验:
另一个达梦数据库:表数据量140万
image.png
SQL1执行计划:(查询耗时38ms)
image.png
SQL2执行计划:(查询耗时33ms)
image.png
SQL3执行计划:(查询耗时37ms)
image.png
疑惑:单数据库上看感觉执行计划有问题,对比后再看是否是表数据量达到某个阈值会使执行计划变笨?

回答 0
暂无回答
扫一扫
联系客服