按特定值过滤时,SQL Server 查询永远不会完成

Posted

技术标签:

【中文标题】按特定值过滤时,SQL Server 查询永远不会完成【英文标题】:SQL Server Query never completes when filtered by specific value 【发布时间】:2018-11-08 21:33:26 【问题描述】:

我在 SQL Server 2008 R2 生产环境中有一个名为 inventory_transaction 的表。表和索引以及维护它们的维护包是由专业供应商开发的。自从实施使用该表的程序以来,我们几乎 10 年都没有遇到任何问题,并且该表的任何索引上都没有超过 8% 的碎片。

但是,我现在遇到了一些麻烦。当我尝试按一个特定值过滤此表时,查询将无法完成。任何其他值都将使查询在

以下是无法完成的具体查询:

DECLARE @BASE_ID VARCHAR(30) = 'W46873'    

SELECT * 
FROM PROD.DBO.INVENTORY_TRANS  
WHERE WORKORDER_BASE_ID = @BASE_ID

我让它运行 35 分钟,然后取消它。我从未收到错误消息。如果我在@BASE_ID 中输入任何其他值,它将在 WORKORDER_BASE_ID 上的等号运算符更改为使用LIKE 并将@BASE_ID 更改为@BASE_ID = 'W4687%',它将起作用。此列中的所有值都是相同的格式(W + 5 个数字)。

@BASE_ID 的数据类型与表中的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)

【问题讨论】:

inventory_trans 是表还是视图?它有多大? 我会删除并重新创建索引。 这是一张桌子。数据空间约为 80MB,索引空间约为 55MB。大约 35 万行。 无论如何我都会明确删除并创建索引。另外,您是否尝试过重新编译运行查询? "SELECT * FROM PROD.DBO.INVENTORY_TRANS WHERE WORKORDER_BASE_ID = @BASE_ID 选项(重新编译)" 在 100mb 的桌子上 35 分钟听起来像是阻塞。未提交的事务可能在谓词值需要读取的行之一上具有锁定。当它挂起时,查看等待任务 DMV 以查看它是否正在等待某些东西,如果是,那么是什么。 【参考方案1】:

您的查询可能已被另一个进程阻止。在 SQL Server Management Studio (SSMS) 中运行查询时,检查选项卡标题。末尾带括号的数字是服务器进程 ID (SPID):

当您的查询仍在执行时,在另一个窗口中执行以下命令以检查您的查询是否被阻止:

/* 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_timehostnameprogram_name 和其他列可以查明连接的用户。例如,另一个事务可能仍处于活动状态。

【讨论】:

这就是问题所在!它被另一个阻塞的进程阻塞了……我杀死了根进程,一切都立即清理了。感谢您的清晰解释和指示!对于任何担心我只是杀死进程的人,由于另一个已解决的问题,它被挂起,所以它不应该再次发生。

以上是关于按特定值过滤时,SQL Server 查询永远不会完成的主要内容,如果未能解决你的问题,请参考以下文章

带有WHERE子句逻辑的SQL Server存储过程

数据表过滤器在应用SQL Server 2008分页代码时无法正常工作

请解释sql server选择的查询计划

SQL Server:当过滤器值超出索引直方图范围时使用错误的索引

当值与 SQL Server 中的最后一条记录之间存在特定差距时如何选择值

SQL Server-聚焦WHERE Column=@Param OR @Param IS NULL有问题?