Usando um hint de indice com o Delete ( Index
hint in Delete )
Algumas vezes por
alguma razão especifica você pode precisar fazer deleções repetidas vezes ou deletar um grande volume de dados em grandes tabelas e o otimizador de consultas do SQL Server 2005 não utiliza os índices
para procurar os dados a ser deletados. Como resultado ocorrem
os table scans e há uma
grande lentidão no processo de deleção dos dados.
Uma alternativa para alguns casos em
particular é a utilização dos hints de índice que são
comumente utilizados na clausula select, porem ao
utilizar o hint da mesma forma que é utilizado na
clausula do Select você pode receber a seguinte
mensagem de erro.
Obs: Para este artigo vamos desconsiderar que a utilização
de hints não é aconselhável e etc...
Exemplo de Delete:
DELETE dbo.tbl1 WITH
(INDEX(MEU_INDICE))
WHERE tbl1_no = 1
Quando voce
executa o commando acima voce
recebe a seguinte mensagem de erro:
Msg
1069, Level 15, State 1, Line 2
Index hints are only allowed in a FROM clause.
Note que realmente não temos
o FROM
no comando acima, porem outros hints são permitidos
como WITH (ROWLOCK)
e etc... Sendo um Bug do
SQL ou não temos um meio de executar o comando utilizando o hint,
basta alterar o comando para o seguinte:
DELETE dbo.tbl1
FROM dbo.tbl1
WITH (INDEX(MEU_INDICE))
WHERE tbl1_no = 1
Dessa maneira o comando é
executado com sucesso e o índice indicado será utilizado.
Eduardo Pin
Senior Database Administrator
MCSA MCTS SQL SERVER 2005
Eduardo.pin@diles.com.br