据我们了解,与 SQL Server 2008 及更高版本相关:
ALTER INDEX ... REORGANIZE
Run Code Online (Sandbox Code Playgroud)
在所有版本的 SQL Server 中进行在线操作。
ALTER INDEX ... REBUILD
Run Code Online (Sandbox Code Playgroud)
是 BLOCKING 操作,除非你有 SQL Server 企业版......(即使是企业版,在重建聚集索引时也会阻塞)
如果以上都正确,问题是:
在ALTER INDEX ... REORGANIZE
操作过程中,该表是否可用于读写,或者写入是否被阻塞?
在 ALTER INDEX ... REORGANIZE 操作期间,表是否可用于读取和写入,或者写入是否被阻止?
REORGANIZE 始终是在线操作和单线程操作,但不持有阻塞锁。当您重新组织时,有一个选项,allow_page_locks =ON or OFF
如果您保持此值关闭,您可能会收到错误,例如索引无法重新组织,因为它无法获取页面级锁定,因此最好使用选项重新组织索引allow_page_locks =ON
。所以是的表可用于读写操作锁被视为选项中指出的,但正如我所说,它不持有阻塞锁
关闭页和行锁定可能是也可能不可接受,因为每周批量更新将阻止并发读取器在更新运行时访问表。如果批处理作业只更改了几行或几页,您可以更改锁定级别以允许行或页级别锁定,这将使其他会话能够在不阻塞的情况下从表中读取。如果批处理作业有大量更新,获取表的排他锁可能是确保批处理作业高效完成的最佳方式。
ALTER INDEX ... REBUILD 是 BLOCKING 操作,除非您有 SQL Server Enterprise Edition ....(即使是企业版,在重建聚集索引时也会阻塞)
根据Paul Randal 文章在线索引操作需要两个非常短期的表锁,即使企业版中的索引重建也需要短期锁。操作开始时的 S(共享)表锁以强制所有可能触及索引的写计划重新编译,并在操作结束时使用 SCH-M(模式修改 - 将其视为独占)表锁强制所有可能触及索引的读写计划重新编译。