为什么这种算术运算比强制转换nvarchar更快?

时间:2018-09-05 20:30:31

标签: sql-server tsql sql-server-2017

以下查询速度更快(1:05):

SELECT DATEPART(DW,DATEFROMPARTS(
 FLOOR(20180501/10000)
,FLOOR(20180501-FLOOR(20180501/10000)*10000)/100
,FLOOR(20180501-FLOOR(20180501/100)*100)))
GO 1000

比(1:10):

SELECT DATEPART(DW,CAST(CAST(20180501 AS nvarchar) AS DATE))
GO 1000

为什么?

我有一张表,其中包含大约20亿条记录,因此区别变得很重要。硬编码日期背后还有更多逻辑。否则,如果存在一种在性能方面更好的方法来执行相同的逻辑,请随时纠正我。

日期列始终是整数,并且并不总是具有相同的格式。检索两种格式YYYYMMDD和YYYYMM。我知道,有点混乱。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

每月的第一天(YYYYMM01)为星期一时删除重复的行

如果您想加快删除速度,请创建一个临时表(如果执行此操作则为或永久表 ),该表的数据类型与表的“日期”列相同,且所有第一个星期一XX年中每个月的时间。确保数据格式与您在问题中提到的格式相同。确保此列具有索引(聚集)。现在,在查询中将此表用作筛选器,而无需进行任何转换,这将使Sql Server可以利用现有表的“日期”列上存在的任何索引。