Sei que os índices reduzem o desempenho da modificação de dados, mas tenho uma tarefa em que (quase) todas as atualizações são feitas nos itens em ordem sequencial. Um índice clusterizado melhoraria ou reduziria o desempenho na atualização dessas linhas?
O índice clusterizado estaria na coluna id
onde id
é uma IDENTITY
coluna. id
nunca é alterado e será sequencial (além disso, as linhas nunca devem ser excluídas). Este é o formato das minhas declarações de atualização:
UPDATE [table] SET value = 1
WHERE id IN (1,2,3,4...)
No entanto, os valores não são necessariamente contínuos. Uma sequência de IN (1,2,4,5)
também é possível se id=3
não estiver configurado para ser atualizado, mas eles sempre estarão em ordem.
Quando todas as atualizações estiverem em ordem sequencial, um índice clusterizado melhorará ou reduzirá o desempenho?
O IN como este é um conjunto de valores discretos. O SQL Server não se incomodará em descobrir se é um intervalo ou verificar valores ascendentes.
Ou seja,
x IN (1,2,4,5)
é analisado parax=1 OR x=2 OR x=4 OR x=5
. OR não é SARGable na maioria dos casos e resulta em varreduras em vez de buscas.Se você colocar os dados em uma tabela temporária com um índice e fizer isso
x IN (SELECT foo FROM #bar)
, ela se tornará uma semi-junção e provavelmente usará um índice