Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用format date函数时,SQL查询运行非常慢_Sql_Sql Server_Tsql_Datetime_Query Optimization - Fatal编程技术网

使用format date函数时,SQL查询运行非常慢

使用format date函数时,SQL查询运行非常慢,sql,sql-server,tsql,datetime,query-optimization,Sql,Sql Server,Tsql,Datetime,Query Optimization,使用SQL Server 2016。下表中有大量记录(30 mil+) 以下查询速度非常慢: 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, 3

使用SQL Server 2016。下表中有大量记录(30 mil+)

以下查询速度非常慢:

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
选择
[日期和时间],[文本],[消息],[消息],[严重性]
从…起
[表一]
哪里
格式('2019-06-25'、'2019-06-24'等…)中的([DATE\u TIME]、'yyyy-MM-dd'))
和[MSGID]IN(8016、113072、233062等)
和[严重程度]“中等”
订购人
[日期和时间]说明

请帮助优化。

您提到日期时间列包含时间部分。在这种情况下,我建议创建一个只包含datepart的持久化计算列:

X_DATE AS CAST(DATE_TIME AS DATE) PERSISTED
并将其索引并在where子句中使用:

WHERE [X_DATE] IN ('2019-06-25', '2019-06-24') 
  AND [MSGID] IN (8016, 11, 3072, 23, 3062) 
  AND [SEVERITY] <> 'Medium' 
其中[X_日期]在('2019-06-25'、'2019-06-24'中)
和[MSGID]IN(8016,11,3072,23,3062)
和[严重程度]“中等”

格式有一些很好的功能,但性能会受到影响

试一试


使用直接日期比较。因为你似乎有一个范围,我建议:

WHERE [DATE_TIME] >= ? AND
      [DATE_TIME] < '2019-06-26' AND
      [MSGID] IN (8016, 11, 3072, 23, 3062, etc....) AND
      [SEVERITY] <> 'Medium' 
WHERE[DATE\u TIME]>=?及
[日期和时间]<'2019-06-26'和
[MSGID]IN(8016、113072、233062等)和
[严重程度]“中等”

这可以优化索引和分区的使用(如果可用)。您还可以转换为日期。这是函数的一种用法,它也将使用索引。我不知道convert是否会删除分区。

考虑到[DATE\u TIME]确实是一个datetime,然后转换为DATE。。。在(…)中的convert(date,[date_TIME])是的,使用此转换运行得更快,谢谢John的快速回答。请张贴它,以便我可以标记为“已回答”,因为你已经发现。format()有一些很好的功能,但性能会受到影响。我尽量少用format(),或者在最终结果中使用format(),或者更好,如果OP实际上不需要时间组件,那么就开始存储日期。谢谢Gordon,会注意这个方法的!不过,我对使用转换函数的上述解决方案感到满意,它解决了我的问题
WHERE convert(date,[DATE_TIME]) in (...)
WHERE [DATE_TIME] >= ? AND
      [DATE_TIME] < '2019-06-26' AND
      [MSGID] IN (8016, 11, 3072, 23, 3062, etc....) AND
      [SEVERITY] <> 'Medium'