【问题标题】:Significant performance degradation when not converting to datetime first不首先转换为日期时间时性能显着下降
【发布时间】:2014-08-23 20:47:28
【问题描述】:

当我在查询中间使用字符串作为日期时,我在查询中看到性能下降(慢 2-3 倍),而不是先将字符串值放入 smalldatetime 类型的变量中。所以例如

declare @rptDate AS smalldatetime
set @rtpDate = CAST('2014-06-22' AS smalldatetime)
SELECT SUM(tons) FROM sales
 WHERE ItemClass IN (1, 3, 5, 7) 
   AND AcctNo LIKE '31_-30[12]0'
   AND YEAR(InvDate) = YEAR(@rptDate) 
   AND MONTH(InvDate) = MONTH(@rptDate) '
   AND DAY(InvDate) <= DAY(@rptDate)

肯定比

SELECT SUM(tons) FROM sales
 WHERE ItemClass IN (1, 3, 5, 7) 
   AND AcctNo LIKE '31_-30[12]0'
   AND YEAR(InvDate) = YEAR('2014-06-22') 
   AND MONTH(InvDate) = MONTH('2014-06-22') 
   AND DAY(InvDate) <= DAY('2014-06-22')

那么为什么这里没有发生“适当的优化”呢?

【问题讨论】:

  • 您是否尝试过为@month@day@year 制作三个单独的变量?
  • 如果需要将字符串解析为每一行的日期。而且它可能会扼杀索引的使用。

标签: sql performance tsql datetime type-conversion


【解决方案1】:

我会更进一步

declare @rptDate AS smalldatetime
declare @year as int 
declare @month as int
declare @day as int
set @rtpDate = CAST('2014-06-22' AS smalldatetime)
set @year  = year(@rtpDate)
set @month = month(@rtpDate)
set @day   = day(@rtpDate)

SELECT SUM(tons) FROM sales
 WHERE ItemClass IN (1, 3, 5, 7) 
   AND AcctNo LIKE '31_-30[12]0'
   AND YEAR(InvDate)  = @year 
   AND MONTH(InvDate) = @month
   AND DAY(InvDate)  <= @day

【讨论】:

  • 我意识到这可以优化。我真正在寻找的是为什么 SQL Server 不能自己进行这种优化。这似乎是一个明显的例子。 T-SQL 或 SQL Server 是否有一些固有的东西我错过了为什么它不能?
  • 我真的很想了解 SQL Server 的内部工作原理。我实际上需要把它放在一个视图中,所以在这种情况下创建变量不是一个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多