选择太多字段会导致表锁定吗?

时间:2015-06-01 14:55:15

标签: sql-server database scalability

我在存储过程中有一个SELECT语句,在非常高的负载下会导致超时:"超出锁定请求超时时间。" - 至少那是.NET抛出的东西。这是一个非常简单的查询表(CODES),它有一个主键和一个聚簇索引(在TYPE_CODE1上)。唯一看起来与众不同的是,选择了许多字段(除了Dclass之外的所有字段都是位字段)。这会导致桌子上的锁吗?还有其他想法吗?

TIA
Ť

select
@TYPE_CODE1 = TYPE_CODE1,
@ALTERNATE_CODE = ALTERNATE_CODE,
@BANNER = BANNER,
@CODE_1 = CODE_1,
@CODE_2 = CODE_2,
@CODE_3 = CODE_3,
@CODE_4 = CODE_4,
from CODES with (nolock)
where
Dclass = @Dclass
and Ret = @Ret
and Rem = @Rem
and Ope = @Ope
and Res = @Res
and Cer = @Cer
and Cdo = @Cdo
and Del = @Del
and Sig = @Sig
and Ads = @Ads
and Adr = @Adr
and Emi = @Emi
and In1 = @In1
and In2 = @In2
and Paa = @Paa
and Reg = @Reg
and Red = @Red
and Rer = @Rer
and Ree = @Ree
and Rei = @Rei
and Spe = @Spe
and Mer = @Mer
and Hol = @Hol
and Day = @Day
and Sca = @Sca
and Sis = @Sis
and Poa = @Poa
and Haz = @Haz
and Sun = @Sun
and Out = @Out
and IsActive = 1

2 个答案:

答案 0 :(得分:3)

Lock Request Timeout exceeded并不总是直接与表锁相关联。该错误意味着查询正在等待获取SQL服务器中对象的锁定,但无法以足够快的速度执行,因此查询超时。

此外,SQL使用名为lock escalation的进程,其中,如果查询需要超过5000个锁(页/行级锁),它将请求完整的表锁。如果你达到这个5000锁定阈值并尝试取消一个表锁定,它可能会被卡在已经锁定它的其他进程后面。

我尝试运行您的应用程序,然后在管理工作室中同时使用sp_Whoisactive等工具,找出阻止您的应用程序并导致其超时的原因。赔率是其他一些进程锁定您要查询的表。

答案 1 :(得分:-1)

在他们访问的任何表上使用NOLOCK提示的SELECT语句永远不会导致锁定或等待它们。所以不应该是导致错误的声明。