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