首页 > 解决方案 > 如果将日期过滤器从字符串文字更改为日期变量,性能会变差

问题描述

我有一个要在日期范围内运行的查询,但我要查询的表没有日期索引,因此没有最佳性能。

所以为了测试它,我加入了一个日历表(calendarid = calendarid),它确实有一个日期索引,并且性能变得更好(从 6-7 秒到 1-2 秒)。

但是当我实际在我的存储过程中实现时,我没有帮助,仍然需要 7 秒,这是非常有趣的原因。

在测试和玩耍之后,我发现如果我用字符串文字进行过滤,说'05/10/2018'执行时间会下降到 2 秒(这就是为什么在测试中它很快),但是如果我过滤变量@DateFrom,时间会增加到 7 秒。

为了验证它,检查了执行计划,对于日期字符串过滤器,它只扫描日期索引上的日历表一次,然后连接其他表。但是对于变量,它会在日历表上进行两次扫描,一次扫描主键,第二次扫描日期索引,然后将它们连接起来。

所以我在这里有两个问题

  1. 为什么变量需要更长的时间
  2. 是否有解决性能的解决方案

我添加了执行计划的图片,首先是字符串日期过滤器'05/10/2018',其次是日期变量过滤器@DateFrom

日期字符串<code>'05/10/2018'</code>的执行计划 日期变量执行计划<code>@DateFrom</code>

标签: sqlsql-server

解决方案


推荐阅读