首页 > 解决方案 > 为什么这个算术计算比 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

为什么?

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

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

谢谢!

标签: sql-servertsqlsql-server-2017

解决方案


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

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


推荐阅读