使用格式化日期函数时 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 查询运行速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

SQL Date 函数

sql日期

SQL Date 函数

SQL基本操作——日期函数

SQL里怎么把日期截取为月份

SQL-W3School-高级:SQL Date 函数