SQL 查询有效,但需要太多时间才能完成

SQL Query works but it takes too much time to complete

提问人:Emmanuel_InfTech 提问时间:3/31/2023 更新时间:4/1/2023 访问量:47

问:

我有这个“简单”的 SQL 查询,它可以工作,但需要 11 分钟才能完成。 你能告诉我是否有办法简化代码或其他东西以获得更好的性能和更快的响应吗? 注意:查询已在服务器 (Windows Server 2019) 的 SQL Management Studio 18.6 中运行。 先谢谢你。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT DISTINCT COUNT(*)
FROM [MyDataBase].[dbo].[ScanJobLog]
WHERE (ScanJobLog.StationID = '207' OR  ScanJobLog.StationID = '208' OR  ScanJobLog.StationID = '218' OR  ScanJobLog.StationID = '219') AND (ScanJobLog.Occurred BETWEEN '2023-03-28' AND '2023-03-29')
AND (ScanJobLog.ScanJobResult = '2')
AND (Scan LIKE 'L001620321%')
sql-server sqlperformance sql-query-store

评论

2赞 Thom A 3/31/2023
你能粘贴计划吗?你表上的索引是什么?当您也标记了查询存储时,您是否注意到查询或其他方面的计划已更改?dbo.ScanJobLog
1赞 Sergey 3/31/2023
我建议删除 DISTINCT。还请澄清您是否在 [dbo] 上有任何索引。[扫描作业日志]
0赞 Emmanuel_InfTech 3/31/2023
谢谢你的回答。我看到它有一个索引(聚类)。我没有创建数据库,但我认为索引是自动创建的。我应该创建一个新的吗?我几乎没有创建索引的经验。如果你愿意,我可以与你分享一张图片(截图),这样你就可以在数据库中看到索引,但我不能把它粘贴到这里:(
1赞 Thom A 3/31/2023
聚集索引不会自动创建。我们真正需要的是执行计划,可能还有表上任何索引的定义;索引的图像没有帮助。

答:

0赞 Zorkolot 4/1/2023 #1

为了简单起见,您可以创建一个非聚集索引,引用:(https://learn.microsoft.com/en-us/sql/relational-databases/indexes/create-nonclustered-indexes?view=sql-server-ver16)。

我可以在没有执行计划的情况下确定所需的非聚集索引,因为您提供了 where 子句,并且示例中的 where-子句标识了要索引的列。您还在评论中说,除了聚集索引之外,您没有其他索引(这很可能也是您的主键,因为将主键设为聚集索引是默认的 SQL Server 行为)。

CREATE NONCLUSTERED INDEX ncx_scanJobLog_StationID_Occurred_ScanJobResult_Scan
 ON [dbo].[ScanJobLog] (StationID, Occurred, ScanJobResult, Scan)

需要注意的是,如果 where 子句中有任何主键列,则可以排除它们。关于索引的问题显然还有更多要说的,但这超出了你最初问题的范围。