No próximo ano, estou ajudando um esforço para limpar vários ambientes do SQL Server.
Temos cerca de 10.000 procedimentos armazenados e estimamos que apenas cerca de 1000 sejam usados regularmente e outros 200 sejam 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 os que chamam os procedimentos, o que significa que devemos determinar como os 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 SQL Server Profiler
e rastrear quais procedimentos estão sendo chamados e compará-los com a lista de quais procedimentos temos, marcando se os procedimentos são usados ou não. A partir de então, poderíamos mudar os procedimentos para um esquema diferente, caso um departamento grite.
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?
fonte
Você pode encontrar essa pergunta ú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 o ApexSQL como engenheiro de suporte
fonte
unreferenced stored procedures
, em vez disso, deseja encontrar o SP não utilizado. Sua resposta não serve como resposta para esta pergunta.Se você estiver no SQL Server 2008 ou superior, também poderá usar eventos estendidos com um destino de histograma . Possivelmente isso seria mais leve do que um traço.
No AFAIK, você precisaria criar uma sessão diferente para cada banco de dados de interesse, já que eu não conseguia ver nenhuma indicação de que o agrupamento em várias colunas fosse possível. O exemplo rápido abaixo filtra
database_id=10
E depois de executar alguns procedimentos armazenados nesse banco de dados algumas vezes e recuperar os dados com
A saída é
Mostrando que o procedimento com
object_id
de1287675635
foi executado 36 vezes, por exemplo. Aasynchronous_bucketizer
memória é apenas, portanto, seria melhor configurar algo que controla isso de vez em quando e salva o armazenamento persistente.fonte
WHERE (source_database_id IN (10,15,20))
mas infelizmente isso não é suportado.object_id
(ou mesmoobject_name
) em diferentes bancos de dados separadamente e também não acho que isso seja possível.extended events
onde foi adicionado em 2012 e não em 2008?Como acompanhamento 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.
fonte
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":
fonte