【问题标题】:Does creating a nonclustered index on a SQL Server 2005 table prevent selects?在 SQL Server 2005 表上创建非聚集索引会阻止选择吗?
【发布时间】:2009-12-16 17:49:34
【问题描述】:

我想在我拥有的视图上创建索引,但我需要确保在创建索引时仍然可以读取数据。我正在阅读article,它建议在创建非聚集索引时,如果您指定 ONLINE=ON 选项(以下示例),数据仍然是可读的:

CREATE UNIQUE CLUSTERED INDEX CLUST_IDX_SQLTIPS
ON SQLTips (tip) with (ONLINE=ON) 

我理解正确吗?在创建索引时需要可读的视图上创建索引之前,我应该注意哪些潜在问题?

【问题讨论】:

    标签: sql-server indexing locking


    【解决方案1】:

    在线索引创建和重建仅在企业版上可用。请参阅How Online Index Operations WorkGuidelines for Performing Online Index Operations

    有一些限制,最值得注意的是:

    • 如果聚集索引包含任何 BLOB 字段(image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml),则必须离线创建/重建聚集索引。
    • 必须离线创建视图的初始聚集索引。

    您必须确保您的数据库有足够的空间来执行在线索引操作,因为它需要大约 1.5 倍的表大小添加到当前大小。在联机索引创建期间,该表在数据库中存在两次,因此需要额外的空间。

    由于您的案例属于排除类别(视图上的初始聚集索引),因此您不必担心在线索引。您必须使用离线索引操作。

    顺便说一句,您还必须知道索引视图仅在企业版中被优化器考虑。在较低版本中,必须在视图中指定 NOEXPAND 子句以利用视图上的可能索引。

    【讨论】:

    • 谢谢,我没有意识到这一点。我计划在此视图上创建两个索引,您提到的初始集群索引和之后的非集群索引。在我创建初始集群时,您是否知道在我的视图中保持数据可读?顺便说一句,我正在运行企业版。
    • 聚集索引视图将锁定表中的行,从而阻止读取锁定的行(在默认序列化级别下)。桌子有多大?我们是在谈论几秒钟或几小时的索引创建时间吗?您可以考虑启用读取提交快照,这将允许 SELECT 不受影响地继续进行。但这会对系统产生全局影响,特别是对 tempdb,因此您应该事先明确测试。
    • 该表有超过 900 万条记录。我认为创建索引大约需要 15 分钟。如果人们不能阅读 15 分钟,那么我就有问题了。您能否更具体地说明启用已提交读取对系统的影响?您会如何建议事先进行测试?
    • 您也可以考虑创建数据库快照并将连接临时重定向到该快照。取决于数据库在操作期间将接收多少更新以及应用程序是否必须显示这些最近的更新。如果应用程序可以在操作期间与您开始操作时的数据库图像(即“快照”)一起存在,那么您可以明确地使用它。
    • create database foo as snapshot of bar 几乎是瞬间的。不涉及复制,快照使用 OS 稀疏文件 API 在原始数据库的逐页基础上进行写时复制。非常适合报告。
    【解决方案2】:

    有关CREATE INDEXonline index operations 的msdn 文章中有更多信息,其中包含大量相关信息。

    如果您只进行 SELECT 和 UPDATE,应该没有问题。对备份不太确定,也许最好在测试系统上试试看?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2018-05-08
      • 1970-01-01
      • 2012-10-01
      • 2013-05-20
      相关资源
      最近更新 更多