SQL Server 2012:为什么 where 子句中的不同值会阻止 select 查询?
SQL Server 2012: why different values in where clause would block a select query?
我们的应用程序执行这两个查询:
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=3
和
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=2
根据用户正在考虑的公司 ID。
好吧,虽然第二个查询被正确执行,但第一个查询阻塞并且永远不会执行。在 LETTUREAPERTE
table 中有不到 400 条记录,有些 IDAZIENDAOPERATORE
有 2 条,有些有 3 条。
我不知道为什么会这样,也不知道为什么第一个查询会阻塞...最后我得到了这个错误我得到一个错误说该进程被选为死锁牺牲品。
Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
我什至 运行 一些查询来检测 table 的某些记录上是否有更新锁,但 none。所以一定是因为在整个项目中我们从未在查询中使用 UPDLOCK...
一种可能性是 uncommitted/unrolled 对其中一行的返回交易 3
。
如果使用事务,您需要使用 TRY/CATCH 并提交或回滚。
您可以尝试使用 (NOLOCK)
:
select A.* from LETTUREAPERTE A (NOLOCK)
where IDAZIENDAOPERATORE=3
另一种选择是重新启动 SQL 服务器以查看是否可以解决问题,但很可能再次发生
正如 Gordon 在评论中建议的那样,添加选项重新编译,如下所示
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=2 OPTION (RECOMPILE)
尝试通过 Adam Mechanic 运行 sp_WhoIsActive
并跟踪可能使用相同 table 来源的交易。之后在sp_lock
(系统一)中找到这个对象。基于此,您应该了解为什么会出现这种僵局。
可能在执行期间值 2 未被与值 3 相同的(锁定的)索引使用 - 这在 table 上使用过滤索引时是可能的。
正如 ** Bartosz X** 向我建议的那样,我为每个 table 参与视图的人启动了以下命令:
UPDATE STATISTICS [Schema].[Table_Name] WITH FULLSCAN
花了大约一个小时才完成,但情况似乎有了很大改善。
因此,我添加了以下每周执行的维护计划:
如果有兴趣,这是我的观点的查询:
SELECT
IDOPERATORE,
COGNOMENOMEOPERATORE,
IDAZIENDAOPERATORE,
(SELECT
SUM(LETTURERIMASTE) AS Expr1
FROM dbo.LETTURERIMASTE AS B
WHERE (IDLOTTOLETTURISTA IN
(SELECT IDLOTTOLETTURISTA
FROM dbo.LOTTILETTURISTA AS C
WHERE (DATAFINELOTTOLETTURISTA >= CONVERT(datetime, ROUND(CONVERT(float, GETDATE()), 0, 1))) AND (IDLETTURISTALOTTOLETTURISTA = A.IDOPERATORE))))
AS LETTURERIMASTE
我们的应用程序执行这两个查询:
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=3
和
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=2
根据用户正在考虑的公司 ID。
好吧,虽然第二个查询被正确执行,但第一个查询阻塞并且永远不会执行。在 LETTUREAPERTE
table 中有不到 400 条记录,有些 IDAZIENDAOPERATORE
有 2 条,有些有 3 条。
我不知道为什么会这样,也不知道为什么第一个查询会阻塞...最后我得到了这个错误我得到一个错误说该进程被选为死锁牺牲品。
Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
我什至 运行 一些查询来检测 table 的某些记录上是否有更新锁,但 none。所以一定是因为在整个项目中我们从未在查询中使用 UPDLOCK...
一种可能性是 uncommitted/unrolled 对其中一行的返回交易 3
。
如果使用事务,您需要使用 TRY/CATCH 并提交或回滚。
您可以尝试使用 (NOLOCK)
:
select A.* from LETTUREAPERTE A (NOLOCK)
where IDAZIENDAOPERATORE=3
另一种选择是重新启动 SQL 服务器以查看是否可以解决问题,但很可能再次发生
正如 Gordon 在评论中建议的那样,添加选项重新编译,如下所示
select A.* from LETTUREAPERTE A
where IDAZIENDAOPERATORE=2 OPTION (RECOMPILE)
尝试通过 Adam Mechanic 运行 sp_WhoIsActive
并跟踪可能使用相同 table 来源的交易。之后在sp_lock
(系统一)中找到这个对象。基于此,您应该了解为什么会出现这种僵局。
可能在执行期间值 2 未被与值 3 相同的(锁定的)索引使用 - 这在 table 上使用过滤索引时是可能的。
正如 ** Bartosz X** 向我建议的那样,我为每个 table 参与视图的人启动了以下命令:
UPDATE STATISTICS [Schema].[Table_Name] WITH FULLSCAN
花了大约一个小时才完成,但情况似乎有了很大改善。 因此,我添加了以下每周执行的维护计划:
如果有兴趣,这是我的观点的查询:
SELECT
IDOPERATORE,
COGNOMENOMEOPERATORE,
IDAZIENDAOPERATORE,
(SELECT
SUM(LETTURERIMASTE) AS Expr1
FROM dbo.LETTURERIMASTE AS B
WHERE (IDLOTTOLETTURISTA IN
(SELECT IDLOTTOLETTURISTA
FROM dbo.LOTTILETTURISTA AS C
WHERE (DATAFINELOTTOLETTURISTA >= CONVERT(datetime, ROUND(CONVERT(float, GETDATE()), 0, 1))) AND (IDLETTURISTALOTTOLETTURISTA = A.IDOPERATORE))))
AS LETTURERIMASTE