像查询是锁定表?

时间:2012-12-24 22:52:19

标签: sql-server

我有一个专栏,我正在做'%X%'查询,为了简单起见,我这样做了,因为随着数据量的增长,我不得不重新审视它。

然而,我没想到的一件事就是它锁定了桌子,但似乎是这样做的。查询速度很慢,如果查询正在运行,则其他查询在完成之前不会完成。

我要求的是关于为什么会发生这种情况的一些一般性想法,以及关于如何深入研究SQL Server以更好地了解锁定方面的建议。

我应该提到所有查询都是SELECT,除了我每隔60秒唤醒一次以检查各种内容并可能INSERT行的服务。此表永远不会更新,仅CRD,而不是CRUD,但问题是一致的而不是间歇性的。

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为LIKE'%X%'将强制完成扫描。如果有一个可以使用的索引,那么引擎将扫描索引,但它需要读取每一行。如果没有非聚簇索引,则引擎将执行聚簇索引扫描,如果表是堆,则执行表扫描。

这是因为LIKE%somevalue%构造。比如说,如果你有一个电话簿,并且你被要求找到名字中间某个X的所有人,你必须阅读索引中的每个条目。另一方面,如果它是'X%',你就知道你只需要查看以'X'开头的条目。

由于必须扫描整个表,因此可能会将行锁升级为表锁 - 这不是一个缺陷,SQL Server几乎总是正确的,因为它确定它更有效地放置一个表上的单锁比100,000行锁,但它确实阻止了写操作。

我的建议是,您尝试查找比LIKE'%X%'更好的查询。