Acabei de indexar uma visão que retorna 126 milhões de linhas.
Há um processo que usa essa visão para atualizar linhas usando um gatilho e é de longe o processo mais caro do meu banco de dados.
Estou monitorando esses novos DMVs de uso de índice e tenho uma forte sensação de que há muito poder de processamento envolvido na manutenção desse índice para equilibrar sua utilidade.
Executando a consulta abaixo, ele me diz que a cada 2-5 segundos há uma busca de usuário neste índice. Durante o mesmo período, haverá cerca de 250 a 1.000 atualizações de usuários. Desde sua criação há 15 minutos, USER_SEEKS=386 enquanto USER_UPDATES=102 876.
Existe uma proporção mágica em que você pode dizer com segurança que não vale a pena manter esse índice?
SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = S.[OBJECT_ID] AND I.INDEX_ID = S.INDEX_ID
WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
AND S.database_id = DB_ID()
and I.NAME ='<index_name_goes_here>'
Existe uma proporção mágica em que você pode dizer com segurança que não vale a pena manter esse índice?
Não existe um número mágico que existe. Você pode ter um índice que é usado raramente (compare com o número de atualizações), mas o suporte a essa consulta é importante para seus negócios/usuários.
É uma chamada que só você pode fazer com base na necessidade do seu negócio/usuário.
Se você quiser testar, não descarte o índice. Você pode desabilitar o índice para que seus metadados sobre o índice sejam preservados. Aqui está um bom post sobre isso.
Índices Desabilitando vs. Descartando por Jes Borland.