簡體   English   中英

使用格式日期功能時,SQL查詢運行速度非常慢

[英]SQL query runs very slow when using format date function

使用SQL Server2016。我具有下表,該表具有大量記錄(超過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

請幫助優化。

格式具有一些強大的功能,但性能會受到影響。

嘗試

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

您提到DATE_TIME列包含時間部分。 在那種情況下,我建議創建一個僅包含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' 

使用直接日期比較。 因為您似乎有一定范圍,所以我建議:

WHERE [DATE_TIME] >= ? AND
      [DATE_TIME] < '2019-06-26' AND
      [MSGID] IN (8016, 11, 3072, 23, 3062, etc....) AND
      [SEVERITY] <> 'Medium' 

如果可以的話,這可以最佳地利用索引和分區。 您還可以將其轉換為date 那是一種功能的用途,它將同時使用索引。 我不知道轉換是否會修剪分區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM