Eu quero acelerar o seguinte pedaço de código
delete from ssn_sdo
where
(art_id=@art_id and skl_id=@skl_id and @level=0 )
or (art_id=@art_id and skl_id=@skl_id and @level=1 and tip=@tip)
or (art_id=@art_id and skl_id=@skl_id and doc_id = @doc_id)
Meu servidor é MS SQL-Server 2005.
art_id
, skl_id
e doc_id
são inteiros, enquanto tip é o varchar(10)
tipo de.
Eu quero fazer um índice(s) na ssn_sdo
tabela para que essa exclusão seja mais rápida.
O que eu estava pensando em fazer é fazer três índices, cada um para cada caso:
doc_id (ASC), art_id (ASC), skl_id (ASC)
skl_id (ASC), art_id (ASC), tip (ASC)
skl_id (ASC), art_id (ASC),
Ou existe uma maneira melhor de criar um índice que inclua todos os três casos.
Sou cuidadoso com os índices porque não quero desacelerar as inserções nesta tabela.
Um pouco estranho, não sei como comentar, mas queria perguntar por que sua condição não é:
Não tenho certeza se isso ajuda, antes ou depois de adicionar outros índices, mas é interessante ver os planos de execução (reais) e ver se algum benefício é percebido.
Um índice em
(art_id, skl_id, doc_id, tip)
é provavelmente o suficienteTodas as condições começam, o
(art_id, skl_id)
que deve dar uma busca e, em seguida, uma pesquisa residual emdoc_id
outip
será feita posteriormenteO índice também pode ser
(skl_id, art_id, doc_id, tip)
baseado no número de valores exclusivos em cada coluna: a maior exclusividade deve vir primeiroVários índices significarão que o plano de consulta em cache pode ser abaixo do ideal para diferentes condições
Obviamente, se um ou ambos
art_id
/skl_id
já for o índice clusterizado, talvez você não precise de um índice porque ele buscará no índice clusterizado e, em seguida, fará um resíduo. Sedoc_id
for o índice clusterizado, você precisará do índice extra