关于创作聚集索引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) 转到
如果您知道谁(用户)正在执行,则决定是否终止该过程或提交事务。
杀进程间进程
再次创建索引。