我有一个包含大约200万条记录的表,我需要在uniqueidentifier中添加一个新的非聚簇索引,以提高查询性能。
添加非聚集索引是否会锁定表格,否则会在应用时显着降低性能?
有很多关于索引的好处/缺陷的信息,但我找不到任何告诉我在索引操作期间发生的事情
我正在运行SQL Server 2008 R2(在Windows Server 2008上,如果这很重要)
编辑:这是企业版
答案 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%肯定,尝试文档,但你明白了。)
软锁不是问题,具体取决于您的隔离级别(以及应用于选择的提示)。 如果你使用一个非常具有限制性的隔离级别(这会使得这个问题很难受到尊重),这可能会成为一个问题。
无论如何,我建议你打书并做一些酸测试。这是一个非常复杂的主题,很大程度上取决于您的特定情况。