sql-server - 为什么这个算术计算比 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。我知道,有点乱。
谢谢!
解决方案
当月的第一天 (YYYYMM01) 是星期一时删除重复的行
如果您想加快删除速度,请创建一个临时表(或永久表,如果这是重复操作),其数据类型与表的“日期”列相同,并且在 XX 年中每个月的所有第一个星期一。确保数据的格式与您在问题中提到的格式相同。确保该列具有索引(聚集)。现在在您的查询中使用此表作为过滤器,而不进行任何转换,这将允许 Sql Server 利用现有表的“日期”列上存在的任何索引。
推荐阅读
- java - 如何转换为 kotlin window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
- python - 如何在 Python 中解决这个递归函数?
- java - 在 Recyclerview 中使用 RecyclerView 在 Firestore 中查询要显示的项目
- mysql - MySQL Query - 计算多个表之间的值并按 id 分组
- c# - 如何处理从 bot 框架 v4 中的技能收到的活动?
- docker - 有没有办法在容器中获取容器名称?
- sql - Oracle SQL - 加入和拥有
- ruby-on-rails - 从运行在 Minikube 集群上的 rails 应用程序访问本地 postgres 数据库
- linux - 如何在gid检查下替换文件?
- python - 试图从 git pull 中删除身份验证会创建奇怪的合并冲突和不应该存在的更改