【问题标题】:Why this arithmetic calculation is faster than cast nvarchar?为什么这个算术计算比 cast nvarchar 快?
【发布时间】:2018-09-05 20:30:30
【问题描述】:

以下查询更快(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。我知道,有点乱。

谢谢!

【问题讨论】:

  • 旁注 为什么不创建 Date 类型的新列或计算列?使用整数(或任何其他非日期类型)来存储日期被认为是不好的做法。
  • 你转换它们是为了什么?过滤/显示/ETL ?
  • Igor 的重点是使用 DATE 数据类型,而不是不断地转换为日期。这会影响你的表现,并且是使用正确数据类型的数百个论点之一。
  • Delete duplicate rows when the first day of the month (YYYYMM01) is monday
  • @Igor 是的,我得到了这个按日期和 customer_id 索引的表。听起来不错!谢谢!我会测试它!

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多