创建空间索引会锁定表数小时

Ale*_*lex 3 index sql-server-2008-r2 spatial

我使用以下代码在 SQL Server 2008 R2 中创建空间索引:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE SPATIAL INDEX SPATIAL_COMPANIES_GEO ON dbo.ITEMS(GEO) USING GEOGRAPHY_GRID
 WITH( 
          GRIDS  = ( LEVEL_1  = HIGH, LEVEL_2  = HIGH, LEVEL_3  = HIGH, LEVEL_4  = HIGH)
        , CELLS_PER_OBJECT  = 100
        , STATISTICS_NORECOMPUTE = OFF
        , ALLOW_ROW_LOCKS = ON
        , ALLOW_PAGE_LOCKS = ON
     )
GO
ALTER TABLE dbo.COMPANIES SET (LOCK_ESCALATION = TABLE)
GO
Run Code Online (Sandbox Code Playgroud)

该查询在 5 秒内执行,但随后该表ITEMS似乎被锁定了几个小时。在 Management Studio 中,我无法展开索引文件夹,ITEMS并且对该表的任何查询都会超时。此外,如果我重新启动 SQL Server 服务,我刚刚创建的空间索引就会消失。

我已经在包含 3.000.000 条记录的生产数据库上尝试过此操作,也在包含 300.000 条记录的测试数据库上尝试过此操作,结果相同。

这是正常的吗?我应该怎么做才能在不锁定数据库的情况下创建索引?

gbn*_*gbn 5

您启动一个事务但不提交第二个事务,因此表将保持锁定状态。
SQL Server重新启动将回滚包含CREATE INDEX的事务

删除两个 BEGIN TRANSACTION调用 和COMMIT
(或添加最后一个COMMIT TRAN