将添加非聚集索引锁定我的表吗?

时间:2014-02-28 11:53:56

标签: sql sql-server sql-server-2008-r2 indexing

我有一个包含大约200万条记录的表,我需要在uniqueidentifier中添加一个新的非聚簇索引,以提高查询性能。

添加非聚集索引是否会锁定表格,否则会在应用时显着降低性能?

有很多关于索引的好处/缺陷的信息,但我找不到任何告诉我在索引操作期间发生的事情

我正在运行SQL Server 2008 R2(在Windows Server 2008上,如果这很重要)

编辑:这是企业版

3 个答案:

答案 0 :(得分:19)

对于我们这些运行“昂贵版”(企业版)的人,答案是:

  

创建非聚集索引的脱机索引操作   表上的共享(S)锁。这可以防止更新   基础表但允许读取操作,例如SELECT   语句。

所以基本上它在构建索引时呈现目标表“只读”。对于您的覆盖应用程序,这可能是也可能不是问题 - 请与您的开发团队和用户核实!

PS:是否适用这样的索引的问题或原因是一个完全不同的对话。 SQL社区及其专业博客群和中小企业是你的朋友。

答案 1 :(得分:13)

在Enterprise Edition中,您可以进行在线索引操作。它看起来像这样:

create index MyIDX on MyTable (MyColumn) with (online = on)

请注意,该操作在此过程中(在开始和结束时,IIRC)仍会执行某些锁定,但在创建索引期间不会锁定表。如果您担心,请在非生产环境中启动扩展事件会话,并在创建索引时跟踪创建的锁以及它们存在的时间。

更新:documentation对在线和离线操作时锁定的内容有很好的说明。

答案 2 :(得分:0)

取决于(很多事情)作为经验法则添加索引,改善选择和降级插入。 uniqueidentifier基本上是一个大小固定的随机短语,并且由于它,索引病态可以快速分段。

对于插入,它会在行级别获得独占锁定(因为该行正在"构建")以及页面级别或表级别的软锁定(i' m不是100%肯定,尝试文档,但你明白了。)

软锁不是问题,具体取决于您的隔离级别(以及应用于选择的提示)。 如果你使用一个非常具有限制性的隔离级别(这会使得这个问题很难受到尊重),这可能会成为一个问题。

无论如何,我建议你打书并做一些酸测试。这是一个非常复杂的主题,很大程度上取决于您的特定情况。