为什么这个算术计算比 cast nvarchar 快?

Why this arithmetic calculation is faster than cast nvarchar?

以下查询速度更快 (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

为什么?

我有一个 table 有 20 亿条记录(大约)所以差异变得很重要。硬编码日期背后有更多的逻辑。否则,如果在性能方面存在更好的方法来执行相同的逻辑,请随时纠正我。

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

谢谢!

Delete duplicate rows when the first day of the month (YYYYMM01) is monday

如果您想加快删除速度,请创建一个临时的table(或永久的,如果这是重复操作),其中包含与您的数据类型相同的列table 的 "date" 列包含 XX 年中每个月的所有第一个星期一。确保数据的格式与您在问题中提到的格式相同。确保该列有一个索引(聚集)。现在在您的查询中使用此 table 作为过滤器而不进行任何转换,这将允许 Sql 服务器利用现有 table 的 "date" 上存在的任何索引列。