使用格式化日期函数时 SQL 查询运行速度很慢
Posted
技术标签:
【中文标题】使用格式化日期函数时 SQL 查询运行速度很慢【英文标题】:SQL query runs very slow when using format date function 【发布时间】:2019-07-04 13:52:08 【问题描述】:使用 SQL Server 2016。我有下表,其中包含大量记录(3000 万+)。
CREATE TABLE [dbo].[TABLE1]
(
[DATE_TIME] [DATETIME] NULL,
[TEXT] [VARCHAR](500) NULL,
[MSG] [VARCHAR](500) NULL,
[MSGID] [INT] NULL,
[SEVERITY] VARCHAR(50) NULL
)
CREATE NONCLUSTERED INDEX [TABLE1_IX1]
ON [dbo].[TABLE1] ([DATE_TIME] ASC, [MSGID] ASC, [SEVERITY] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
下面的查询很慢:
SELECT
[DATE_TIME], [TEXT], [MSG], [MSGID], [SEVERITY]
FROM
[TABLE1]
WHERE
FORMAT([DATE_TIME], 'yyyy-MM-dd') IN ('2019-06-25', '2019-06-24',etc.....)
AND [MSGID] IN (8016, 11, 3072, 23, 3062, etc....)
AND [SEVERITY] <> 'Medium'
ORDER BY
[DATE_TIME] DESC
请帮忙优化。
【问题讨论】:
考虑 [DATE_TIME] 确实是日期时间,然后转换为日期... WHERE convert(date,[DATE_TIME]) in (...) 是的,使用此转换它运行得更快,感谢 John 的快速回答。请发布它,以便我标记为“已回答” 如您所见。 format() 有一些很棒的功能,但性能会受到影响。我尝试谨慎使用 format() 或在最终结果中使用 【参考方案1】:格式有一些很棒的功能,但性能可能会受到影响。
试试
WHERE convert(date,[DATE_TIME]) in (...)
【讨论】:
【参考方案2】:使用直接日期比较。因为你似乎有一个范围,我建议:
WHERE [DATE_TIME] >= ? AND
[DATE_TIME] < '2019-06-26' AND
[MSGID] IN (8016, 11, 3072, 23, 3062, etc....) AND
[SEVERITY] <> 'Medium'
这可以优化使用索引和分区(如果可用)。您也可以转换为date
。那是函数的一种用途,它也将使用索引。我不知道 convert 是否会修剪分区。
【讨论】:
感谢 Gordon,会注意这个方法!但是,我对使用 CONVERT 函数解决我的问题的上述解决方案感到满意以上是关于使用格式化日期函数时 SQL 查询运行速度很慢的主要内容,如果未能解决你的问题,请参考以下文章