0

我有一个列我正在做一个类似“%X%”的查询,我这样做是为了简单起见,因为我知道随着数据量的增长我必须重新访问它。

但是,我没想到的一件事是它会锁定表,但它似乎正在这样做。查询很慢,如果查询正在运行,其他查询在完成之前不会完成。

我要的是一些关于为什么会发生这种情况的一般想法,以及关于如何深入 SQL Server 以更好地了解与锁相关的确切情况的建议。

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

4

1 回答 1

1

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

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

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

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

于 2012-12-24T23:09:52.193 回答