我使用这段代码在 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
此查询在 5 秒内执行,但随后表ITEMS
似乎被锁定了几个小时。在 Management Studio 中,我无法展开 Indexes 文件夹,ITEMS
并且对该表的任何查询都会超时。此外,如果我重新启动 SQL Server 服务,我刚刚创建的空间索引就会消失。
我已经在具有 3.000.000 条记录的生产数据库和具有 300.000 条记录的测试数据库上进行了尝试,结果相同。
这是正常的吗?我应该怎么做才能在不锁定数据库的情况下创建索引?
您开始一个事务但不提交第二个事务,因此该表将保持锁定状态。
SQL Server 重启将回滚包含 CREATE INDEX 的事务
删除两个
BEGIN TRANSACTION
调用和COMMIT
(或添加一个 final
COMMIT TRAN
)