为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8
【操作系统】:统信
【CPU】:8
【问题描述】:
sql日志如下
2025-02-18 09:55:49.124 (EP[0] sess:0x7eff0f840cb0 thrd:479647 user:PDSDBA trxid:0 stmt:0x7eff2442e2f8 appname: ip:::ffff:10.71.33.122) [SEL] SELECT /+INDEX(d_worker_label IDX_LABEL_CARD)*/ wl.label_id,COUNT(1) count FROM jzry_data.d_worker_label wl LEFT JOIN jzry_data.s_rns_worker rw ON wl.id_card=rw.id_card WHERE label_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) GROUP BY wl.label_id EXECTIME: 23184(ms) ROWCOUNT: 12(rows) EXEC_ID: 27951839.
同一段sql,同一个数据库环境,在服务里查询需要20多秒,但是可视化界面只需要0.01秒,且服务内其他sql查询时间正常.会是什么原因?
你发的管理工具上执行的SQL,是用常量替换了?的语句,这种不带参数的SQL效率,和你的SQL日志中的带问号参数SQL执行效率可能是不同的。
你直接把这个带参的(带问号的SQL)在你的管理工具上执行一下,看看查询效率,执行的时候会弹出窗口让你填写参数的:
SELECT /+INDEX(d_worker_label IDX_LABEL_CARD)*/ wl.label_id,COUNT(1) count FROM jzry_data.d_worker_label wl LEFT JOIN jzry_data.s_rns_worker rw ON wl.id_card=rw.id_card WHERE label_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) GROUP BY wl.label_id;
遇到这样的情况,
1.管理工具在使用绑定变量时候的那个让你输入数值的地方,每个?对应的数据类型,记录下
2.程序运行的SQL绑定变量,记录在sql运行日志,每个?对应的数据类型,记录下
3.对比一下,是不是有类型对应错了,发生强制转换类型了。
参考:https://eco.dameng.com/document/dm/zh-cn/faq/faq-optimizing.html#%E5%9C%A8%E5%BA%94%E7%94%A8%E4%B8%AD%E5%8F%91%E7%8E%B0%E6%89%A7%E8%A1%8C%E8%BE%83%E6%85%A2%E7%9A%84%20SQL%EF%BC%8C%E5%9C%A8%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7%E4%B8%AD%E6%89%A7%E8%A1%8C%E5%BE%88%E5%BF%AB