[英]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.