在 SQL Server 中创建表索引时出错,如何修复?

在 SQL Server 中创建表索引时出错,如何修复?

替代文本

关于创作聚集索引SQL SERVER 2008 (LIVE DB) 中的表出现上述错误。表中的总记录数为1046789

我已经在测试数据库上创建了具有相同数量记录的相同索引,并且已成功创建。

谢谢。

答案1

我认为您的问题是“我该怎么做才能解决这个问题?”

做出这样的假设:

执行以下任务来缓解该问题:

如果可能,找到持有所需资源锁的事务。使用 sys.dm_os_waiting_tasks 和 sys.dm_tran_locks 动态管理视图。

如果事务仍然持有锁,则在适当的情况下终止该事务。

再次执行查询。

如果此错误频繁发生,请更改锁超时时间或修改有问题的事务,以减少它们持有锁的时间。

如果这不起作用:

在这种情况下,必须在有问题的事务中进行以下更改:1)修改事务使用查询提示(使用 RECOMPILE、MAXDOPhints)2)在较小的事务中运行大事务。3)如果可能,升级硬件。

这里这里

答案2

使用以下命令来准确找出哪些进程持有表上的独占锁。仅供参考,由于任务的复杂性,创建任何类型的索引都必须在表上放置独占锁。在聚集索引中,数据在磁盘上物理重新排列。除非您在创建索引时指定选项 ONLINE = OFF,否则将无法访问表。

运行之前,用真实整数值替换 DATABASE_NAME、DB_ID、OBJ_ID 和 SPID。

创建表 tempdb..#temp_lock
(spid int、dbid int、ObjId int、IndId int、类型 nvarchar(30)、资源 nvarchar(100)、模式 nvarchar(10)、状态 nvarchar(30))

使用数据库名称

插入 tempdb..#temp_lock exec master..sp_lock

从 tempdb..#temp_lock 中选择 spid、ObjId、mode、name 作为内连接 [test2]..sysobjects as b on a.ObjId=b.id where a.dbid =数据库编号

识别在你的桌子上持有“X”模式锁的 Spid。记下对象标识进程间进程来自上一个查询的值。

查明锁定 Spid 正在执行什么。

dbcc 输入缓冲区(进程间进程

或更详细:

声明@Handle二进制(252)

从 master..sysprocesses 中选择@Handle = sql_handle,其中 spid =进程间进程

选择 * 从 ::fn_get_sql(@Handle) 转到

如果您知道谁(用户)正在执行,则决定是否终止该过程或提交事务。

进程间进程

再次创建索引。

相关内容