提问人:Emmanuel_InfTech 提问时间:3/31/2023 更新时间:4/1/2023 访问量:47
SQL 查询有效,但需要太多时间才能完成
SQL Query works but it takes too much time to complete
问:
我有这个“简单”的 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%')
答:
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 子句中有任何主键列,则可以排除它们。关于索引的问题显然还有更多要说的,但这超出了你最初问题的范围。
评论
dbo.ScanJobLog