É possível saber quanto um índice rowstore é usado, mas e o texto completo?
Não consegui encontrar nada em nenhuma GUI ou DMV. Mesmo dbatools não suporta isso .
Herdei um servidor que possui alguns índices de texto completo e não tenho ideia se eles são necessários. Esta questão é minha tentativa de obter os dados necessários para me sentir seguro ao abandoná-los.
Pelo que sei, não há DMV ou similar para mostrar o uso do índice de texto completo. Eu me perguntei se sys.dm_db_index_usage_stats poderia ser usado (e encontrei um resultado que sugeria que sim), mas não acho que isso funcione (mais sobre isso abaixo).
Um método que deve funcionar é usar o Query Store. Se estiver habilitado (e capturando TODAS as consultas), você poderá pesquisar planos armazenados que usam funções de pesquisa de texto completo e, a partir disso, localizar as tabelas/índices relevantes.
Certifique-se de que o Query Store esteja habilitado e o modo de captura esteja definido como ALL:
Como os planos no armazenamento de consultas são armazenados como texto, você pode consultar qualquer índice de texto completo que atinja. Algo assim funcionará:
(Adaptado de: https://www.scarydba.com/2020/05/11/find-indexes-used-in-query-store/ )
Você também pode aproveitar outros aspectos do armazenamento de consultas, como a sobrecarga de desempenho das consultas.
É claro que existem desvantagens - se o Query Store ainda não estiver ativado, você terá que esperar o tempo suficiente para que as consultas apareçam lá e em um ambiente movimentado (especialmente com o modo de captura definido como ALL), você precisa ter certeza você não perde dados devido a liberações de cache de consulta. Provavelmente o mais importante é que você precisa ter certeza de que o texto completo não seja usado ocasionalmente para algo muito importante (aquele relatório executado anualmente e cheio de pesquisas de texto completo que dependem de índices que você descartou há 11 meses). Talvez você possa exportar periodicamente os resultados do armazenamento de consultas ao longo do tempo e analisá-los tarde (mas isso está além do escopo desta questão).
Você não pode provar o negativo e ter 100% de certeza de que algo nunca será usado. O quão certo você pode ter disso depende muito da complexidade do seu ambiente e de quão bem você o conhece (e do seu apetite por risco). A melhor maneira de ter certeza é perguntar às pessoas da sua organização que usam seu banco de dados. Isso pode não ser possível em todos os casos, mas desenvolvedores/redatores de relatórios, etc. podem ajudar - uma solução não técnica, mas pode ser mais eficaz.
Se você não se importa com conselhos não solicitados, por que deseja remover esses índices? O velho ditado “se não está quebrado, não conserte” pode ter valor. Que benefício você busca obter ao removê-los, versus o possível risco se eles forem necessários, mas removidos. Entendo o desejo de 'arrumar' um sistema herdado, mas sugiro que existem maneiras mais fáceis, seguras e potencialmente mais valiosas de fazer isso. É claro que não conheço suas circunstâncias, mas sugiro que você faça isso apenas se achar que esses índices estão realmente causando problemas.
Usando sys.dm_db_index_usage_stats
Uma postagem antiga do stackoverflow sugeriu que isso poderia ser usado para encontrar as estatísticas de uso com sys.dm_db_index_usage_stats, juntando-se a sys.fulltext_catalogs e sys.fulltext_indexes. Qualquer consulta nessas tabelas que atinja os índices fará com que esses contadores aumentem, e não apenas pesquisas de texto completo.
Testei isso no AdventureWorks2019 com o catálogo Full-Text e índices já configurados como padrão.
Usando a consulta dm_db_index_usage_stats:
Resultados do início do teste dm_db_index_usage_stats:
Execute uma consulta de texto completo:
A consulta dm_db_index_usage_stats resulta em aumento de user_scans (conforme esperado):
Mas, uma consulta que não seja de texto completo:
Também resulta na consulta dm_db_index_usage_stats retornando um aumento nas varreduras para esse índice aumentando:
Brinquei mais com isso, mas não fiz nenhum progresso. É possível que ainda haja algo que possa ser usado, mas não consigo encontrar e como está no post antigo, não acho que funcione.