点击上方蓝色字体关注我们

在一个项目中遇到这样一种情况,一个查询SQL在静态SQL和动态SQL下执行性能相差了10倍,那我们分析一下为什么有这么大差距吧!本期主要介绍动态SQL与静态SQL出现不同表现的原因。


环境说明

数据库:达梦数据库管理系统DM8。


分析过程

环境准备
由于最终结果集只有299行,为了精确获得服务端执行的时间,我们将FIRST_ROWS和设置为300,客户端工具取消分页显示,让SQL查询计算出所有结果。
静态SQL执行情况
首先来看静态SQL执行情况:

查看执行计划数据扫描方式为主键索引定位,分别用到了前两个字段的条件:

通过trace 10053可以看到优化器已经将第一个条件I_STARTTIME的范围扫描优化为等值匹配了:

动态SQL的执行情况
我们还是将原始参数值使用绑定参数的方式传入进去执行,执行耗时居然达到了13秒51毫秒。

查看执行计划我们看到数据扫描方式也是通过主键索引定位,但不一样的是只用到了主键索引的第一个条件I_STARTTIME,后面的条件都是在回表之后再过滤的。
这里其实很好理解,由于动态SQL在编译时并不知道参数值,而第一个条件是范围过滤,那么优化器无法使用后续的字段进行索引定位。

分析
那同样是主键索引定位,怎么静态SQL与动态SQL执行时间相差这么大?这时我们应该想到主键索引前两个字段I_STARTTIME与TYPE的过滤性如何:
SQL> select count(*) from t_test where TYPE = 'DATABASE';行号 COUNT(*)---------- --------------------1 54643已用时间: 2.328(毫秒). 执行号:704.SQL> select count(*) from t_test where i_StartTime BETWEEN '2021-05-27 00:00:00' AND '2021-05-28 00:00:00';行号 COUNT(*)---------- --------------------1 496117已用时间: 68.300(毫秒). 执行号:705.
CREATE INDEX IDX_T_TEST_1 ON T_TEST(TYPE ASC,I_STARTTIME ASC);
静态SQL:






总结

本次介绍动态SQL与静态SQL的不同表现。以上为本期分享,希望能带给大家帮助。想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!
作者:yuao
审核:青城
排版:达梦培训中心


一周热文




增量备份解决主备同步归档缺失问题


达梦E学
微信号:DM-Elearning
扫码关注查看更多内容
点击下方在看,分享本文
文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。










