No próximo ano, estou ajudando em um esforço para limpar vários ambientes do SQL Server.
Temos cerca de 10.000 procedimentos armazenados e estimamos que apenas cerca de 1.000 deles são usados regularmente, e outros 200 ou mais são usados em raras ocasiões, o que significa que temos muito trabalho a fazer.
Como temos vários departamentos e equipes que podem acessar esses bancos de dados e procedimentos, nem sempre somos nós que chamamos os procedimentos, o que significa que devemos determinar quais procedimentos estão sendo chamados. Além disso, queremos determinar isso em alguns meses, não em alguns dias (o que elimina algumas possibilidades).
Uma abordagem para isso é usar o SQL Server Profiler
e rastrear quais procedimentos estão sendo chamados e compará-los com a lista de quais procedimentos temos, enquanto marcamos se os procedimentos são usados ou não. A partir daí, poderíamos mover os procedimentos para um esquema diferente, caso um departamento viesse gritar.
Está usando a Profiler
abordagem mais eficaz aqui? E/ou algum de vocês fez algo semelhante e encontrou outra maneira/melhor maneira de fazer isso?
Você pode usar o rastreamento do lado do servidor (diferente de usar a GUI do Profiler que incorre em mais recursos) durante o teste ou o ciclo de negócios e capturar apenas coisas relacionadas aos SPs. Em seguida, você pode carregá-lo em uma tabela ou excel para análise posterior.
A segunda abordagem é usar DMV sys.dm_exec_procedure_stats (com a limitação de que, se o servidor SQL for reiniciado, os dados serão liberados).
Você pode até agendar um trabalho para capturar dados DMV em uma tabela para mantê-los persistentes.
Referir-se :
Você pode achar esta questão útil, ela se aplica a tabelas e colunas, mas sugere o uso de uma ferramenta de terceiros ApexSQL Clean, que também pode encontrar procedimentos armazenados não utilizados, bem como todos os objetos que não são referenciados por nenhum outro objeto no banco de dados ou em bancos de dados externos
Isenção de responsabilidade: trabalho para ApexSQL como engenheiro de suporte
Se você estiver no SQL Server 2008+, também poderá usar eventos estendidos com um destino de histograma . Possivelmente isso seria mais leve do que um traço.
AFAIK, você precisaria criar uma sessão diferente para cada banco de dados de interesse, pois não consegui ver nenhuma indicação de que a segmentação em várias colunas fosse possível. O exemplo rápido abaixo filtra em
database_id=10
E então, depois de executar alguns procedimentos armazenados naquele banco de dados algumas vezes e recuperar os dados com
A saída é
Mostrando que o procedimento com
object_id
of1287675635
foi executado 36 vezes por exemplo. Aasynchronous_bucketizer
memória é apenas para que seja melhor configurar algo que pesquise isso de vez em quando e salve no armazenamento persistente.Como uma continuação do roteiro de Kin. Aqui está um script simples para criar uma tabela para rastrear os usos ao longo do tempo e um script para atualizá-lo periodicamente.
Esta postagem também fornece um script para localizar objetos não utilizados: Encontre as tabelas de banco de dados não utilizadas no SQL Server Abaixo está o script do artigo, alterei o tipo de tabela "U" para o tipo de procedimento armazenado "P":