SQL 按特定值过滤时服务器查询永远不会完成
SQL Server Query never completes when filtered by specific value
我在 SQL Server 2008 R2 生产环境中有一个名为 inventory_transaction
的 table。 table 和索引,以及维护它们的维护包,都是由专业供应商开发的。自实施使用此 table 的程序以来,我们几乎 10 年都没有遇到任何问题,并且 table.
的任何索引上的碎片都没有超过 8%
但是,我现在遇到了一些麻烦。当我尝试按一个特定值过滤此 table 时,查询将无法完成。任何其他值将使查询在 < 1 秒内执行。
这是将不会完成的具体查询:
DECLARE @BASE_ID VARCHAR(30) = 'W46873'
SELECT *
FROM PROD.DBO.INVENTORY_TRANS
WHERE WORKORDER_BASE_ID = @BASE_ID
我让它 运行 了 35 分钟才取消它。我从未收到错误消息。如果我在 @BASE_ID
中放入任何其他值,它将在 <1 秒内执行。如果我将 WORKORDER_BASE_ID
上的等于运算符更改为使用 LIKE
并将 @BASE_ID
更改为 @BASE_ID = 'W4687%'
,它将起作用。此列中的所有值都是相同的格式(W + 5 个数字)。
@BASE_ID
的数据类型与 table 上的列 WORKORDER_BASE_ID
相同。有一个包含此列的非聚集索引正在由正在为其他值完成的其他查询计划中使用。由于这个不会完成,我不确定它使用的实际执行计划是什么。
任何想法可能导致此问题或我可以做些什么来解决它?我可以根据需要提供更多信息。这个问题会导致程序超时,从而产生很多问题。
编辑1:
运行 使用 OPTION(RECOMPILE) 的查询没有帮助。
DECLARE @BASE_ID VARCHAR(30) = 'W46873'
SELECT *
FROM VMFGTEST.DBO.INVENTORY_TRANS
WHERE WORKORDER_BASE_ID = @BASE_ID
OPTION (RECOMPILE)
您的查询可能已被另一个进程阻止。当 运行 您在 SQL Server Management Studio (SSMS) 中查询时,检查选项卡标题。末尾带括号的数字是服务器进程 ID (SPID):
当您的查询仍在执行时,在另一个 window 中执行以下命令以检查您的查询是否被阻止:
/* Replace 70 with actual SPID */
SELECT * FROM sys.sysprocesses WHERE spid = 70
如果 blocked 列包含正数,则这是阻止您的查询的进程的 SPID。有关此过程的更多详细信息,请执行以下命令:
/* Replace 62 with the actual SPID of the process in question */
DBCC INPUTBUFFER(62)
SELECT * FROM sys.sysprocesses WHERE spid = 62
EventInfo 可能会提示您在此连接中正在执行什么,而 login_time
、hostname
、program_name
和其他列可以查明连接的用户。例如,另一笔交易可能仍处于活动状态。
我在 SQL Server 2008 R2 生产环境中有一个名为 inventory_transaction
的 table。 table 和索引,以及维护它们的维护包,都是由专业供应商开发的。自实施使用此 table 的程序以来,我们几乎 10 年都没有遇到任何问题,并且 table.
但是,我现在遇到了一些麻烦。当我尝试按一个特定值过滤此 table 时,查询将无法完成。任何其他值将使查询在 < 1 秒内执行。
这是将不会完成的具体查询:
DECLARE @BASE_ID VARCHAR(30) = 'W46873'
SELECT *
FROM PROD.DBO.INVENTORY_TRANS
WHERE WORKORDER_BASE_ID = @BASE_ID
我让它 运行 了 35 分钟才取消它。我从未收到错误消息。如果我在 @BASE_ID
中放入任何其他值,它将在 <1 秒内执行。如果我将 WORKORDER_BASE_ID
上的等于运算符更改为使用 LIKE
并将 @BASE_ID
更改为 @BASE_ID = 'W4687%'
,它将起作用。此列中的所有值都是相同的格式(W + 5 个数字)。
@BASE_ID
的数据类型与 table 上的列 WORKORDER_BASE_ID
相同。有一个包含此列的非聚集索引正在由正在为其他值完成的其他查询计划中使用。由于这个不会完成,我不确定它使用的实际执行计划是什么。
任何想法可能导致此问题或我可以做些什么来解决它?我可以根据需要提供更多信息。这个问题会导致程序超时,从而产生很多问题。
编辑1: 运行 使用 OPTION(RECOMPILE) 的查询没有帮助。
DECLARE @BASE_ID VARCHAR(30) = 'W46873'
SELECT *
FROM VMFGTEST.DBO.INVENTORY_TRANS
WHERE WORKORDER_BASE_ID = @BASE_ID
OPTION (RECOMPILE)
您的查询可能已被另一个进程阻止。当 运行 您在 SQL Server Management Studio (SSMS) 中查询时,检查选项卡标题。末尾带括号的数字是服务器进程 ID (SPID):
当您的查询仍在执行时,在另一个 window 中执行以下命令以检查您的查询是否被阻止:
/* Replace 70 with actual SPID */
SELECT * FROM sys.sysprocesses WHERE spid = 70
如果 blocked 列包含正数,则这是阻止您的查询的进程的 SPID。有关此过程的更多详细信息,请执行以下命令:
/* Replace 62 with the actual SPID of the process in question */
DBCC INPUTBUFFER(62)
SELECT * FROM sys.sysprocesses WHERE spid = 62
EventInfo 可能会提示您在此连接中正在执行什么,而 login_time
、hostname
、program_name
和其他列可以查明连接的用户。例如,另一笔交易可能仍处于活动状态。