Erro ao criar índice na tabela no sql server, como consertá-lo?

1

Ao criar o índice clusterizado na tabela no SQL SERVER 2008 (LIVE DB), ficou acima do erro. O total de registros na tabela é 1046789 .

Eu criei o mesmo índice no banco de dados de teste com o mesmo número de registros e ele foi criado com sucesso.

Obrigado.

    
por Kashif 31.12.2010 / 14:54

2 respostas

2

Acho que sua pergunta é "o que posso fazer para corrigir isso?"

Fazendo essa suposição:

Perform the following tasks to alleviate the problem:

Locate the transaction that is holding the lock on the required resource, if possible. Use sys.dm_os_waiting_tasks and sys.dm_tran_locks dynamic management views.

If the transaction is still holding the lock, terminate that transaction if appropriate.

Execute the query again.

If this error occurs frequently change the lock time-out period or modify the offending transactions so that they hold the lock for less time.

E se isso não funcionar:

In this scenario following changes must be done in the offending transaction: 1) Modify the Transaction use query hints (use RECOMPILE,MAXDOPhints) 2) Run big Transaction in smaller transactions. 3) Upgrade Hardware if possible.

De aqui e aqui

    
por 31.12.2010 / 14:58
0

Use os seguintes comandos para descobrir exatamente quais processos estão mantendo os bloqueios exclusivos em sua tabela. FYI, criação de qualquer tipo de índice deve colocar bloqueios exclusivos em uma tabela devido à complexidade da tarefa. Em índices agrupados, os dados são reorganizados fisicamente no disco. Nenhum acesso estará disponível na tabela, a menos que você especifique a opção ONLINE = OFF na criação do índice.

Antes de executar, REPLACE DATABASE_NAME, DB_ID, OBJ_ID e SPID com valores inteiros reais.

CREATE TABLE tempdb..#temp_lock
(spid int, dbid int, ObjId int, IndId int, Type nvarchar(30), Resource nvarchar(100), Mode nvarchar(10), Status nvarchar(30))

Use DATABASE_NAME

GO

insert into tempdb..#temp_lock exec master..sp_lock

select spid, ObjId, mode, name from tempdb..#temp_lock as a inner join [test2]..sysobjects as b on a.ObjId= b.id where a.dbid = DB_ID

Identifique o Spid que está segurando o modo "X" na sua mesa. Anote os valores ObjId e SPID da consulta anterior.

Descubra o que o Spid de bloqueio está executando.

dbcc inputbuffer (SPID)

ou mais detalhado:

DECLARE @Handle binary(252)

SELECT @Handle = sql_handle FROM master..sysprocesses WHERE spid = SPID

SELECT * FROM ::fn_get_sql(@Handle) Go

Decida se deseja finalizar o processo ou confirmar a transação se você souber quem (usuário) está executando.

KILL SPID

Crie o índice novamente.

    
por 04.01.2011 / 11:27