使用格式化日期函数时 SQL 查询运行速度非常慢

标签 sql sql-server t-sql datetime query-optimization

使用 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

请帮忙优化。

最佳答案

Format 有一些很棒的功能,但性能可能会受到影响。

尝试

WHERE convert(date,[DATE_TIME]) in (...)

关于使用格式化日期函数时 SQL 查询运行速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56889445/

相关文章:

sql - 将 Datetime 格式转换为 varchar 格式样式的解决方法

sql - 如果最后一个字符是 SQL 中的 char(10),则删除行中的最后一个字符

sql - 需要一些帮助来解决 SQL 分组问题

sql-server - 如何获得带有括号和所有内容的 SQL Server 列定义?

sql - 禁止基于 WHERE 子句的 SELECT 输出

sql - 如何获取存储过程中引用的所有列的列表?

sql-server - T-SQL:包含最近日期的日期列表

mysql - 按相似字符串分组

SQL Server - 同步两个数据库

mysql - MySQL中如何拒绝无效的插入操作?