AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 47025
Accepted
Question3CPO
Question3CPO
Asked: 2013-07-26 13:15:29 +0800 CST2013-07-26 13:15:29 +0800 CST 2013-07-26 13:15:29 +0800 CST

Identificando procedimentos armazenados não utilizados

  • 772

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 Profilere 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 Profilerabordagem mais eficaz aqui? E/ou algum de vocês fez algo semelhante e encontrou outra maneira/melhor maneira de fazer isso?

sql-server profiler
  • 5 5 respostas
  • 21130 Views

5 respostas

  • Voted
  1. Best Answer
    Kin Shah
    2013-07-26T13:48:34+08:002013-07-26T13:48:34+08:00

    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.

     -- Get list of possibly unused SPs (SQL 2008 only)
        SELECT p.name AS 'SP Name'        -- Get list of all SPs in the current database
        FROM sys.procedures AS p
        WHERE p.is_ms_shipped = 0
    
        EXCEPT
    
        SELECT p.name AS 'SP Name'        -- Get list of all SPs from the current database 
        FROM sys.procedures AS p          -- that are in the procedure cache
        INNER JOIN sys.dm_exec_procedure_stats AS qs
        ON p.object_id = qs.object_id
        WHERE p.is_ms_shipped = 0;
    

    Referir-se :

    • Como encontrar procedimentos armazenados não utilizados no SQL Server 2005/2008
    • Identificando objetos não utilizados em um banco de dados
    • 33
  2. Milica Medic Kiralj
    2014-01-24T03:02:23+08:002014-01-24T03:02:23+08:00

    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

    • 11
  3. Martin Smith
    2013-07-26T15:10:09+08:002013-07-26T15:10:09+08:00

    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 emdatabase_id=10

    CREATE EVENT SESSION [count_module_start_database_10]
    ON SERVER
    ADD EVENT sqlserver.module_start
    (  
            WHERE (source_database_id=10) 
    )
    ADD TARGET package0.asynchronous_bucketizer
    (     SET  filtering_event_name='sqlserver.module_start', 
                source_type=0, 
                source='object_id',
                slots = 10000
    )
    WITH (MAX_DISPATCH_LATENCY = 5 SECONDS)
    GO
    ALTER EVENT SESSION [count_module_start_database_10]
    ON SERVER
    STATE=START
    

    E então, depois de executar alguns procedimentos armazenados naquele banco de dados algumas vezes e recuperar os dados com

    SELECT CAST(target_data as XML) target_data
    FROM sys.dm_xe_sessions AS s 
    JOIN sys.dm_xe_session_targets t
        ON s.address = t.event_session_address
    WHERE s.name = 'count_module_start_database_10'
    

    A saída é

    <HistogramTarget truncated="0" buckets="16384">
      <Slot count="36">
        <value>1287675635</value>
      </Slot>
      <Slot count="3">
        <value>1271675578</value>
      </Slot>
      <Slot count="2">
        <value>1255675521</value>
      </Slot>
    </HistogramTarget>
    

    Mostrando que o procedimento com object_idof 1287675635foi executado 36 vezes por exemplo. A asynchronous_bucketizermemória é apenas para que seja melhor configurar algo que pesquise isso de vez em quando e salve no armazenamento persistente.

    • 10
  4. James White
    2016-10-01T07:42:05+08:002016-10-01T07:42:05+08:00

    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.

    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    --  Create the use table 
    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    CREATE TABLE [dbo].[_ProcedureUseLog](
        [ObjectName] [nvarchar](255) NOT NULL,
        [UseCount] [int] NULL,
        [LastUse] [datetime] NULL,
        [LastCache] [datetime] NULL,
     CONSTRAINT [PK___PROCEDURE_USE] PRIMARY KEY CLUSTERED 
    (
        [ObjectName] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[_ProcedureUseLog] ADD  CONSTRAINT [DF_Table_1_References]  DEFAULT ((0)) FOR [UseCount]
    GO
    
    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    --  Run this periodically to update the usage stats
    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    DECLARE @UsesTable TABLE
    (
        ObjectName nvarchar(255),
        Executions int,
        LastUse datetime,
        LastCache datetime
    )
    
    INSERT INTO @UsesTable       
    SELECT p.name, qs.execution_count, qs.last_execution_time, qs.cached_time
    FROM    sys.procedures AS p LEFT OUTER JOIN
            sys.dm_exec_procedure_stats AS qs ON p.object_id = qs.object_id
    WHERE        (p.is_ms_shipped = 0)
    
    MERGE [dbo].[_ProcedureUseLog]      AS [Target]
    USING @UsesTable                    AS [Source]
        ON Target.ObjectName = Source.ObjectName
    WHEN MATCHED AND 
            ( Target.LastCache <> Source.LastCache)
        THEN UPDATE SET
            Target.UseCount = Target.UseCount + Source.Executions,
            Target.LastCache = Source.LastCache,
            Target.LastUse = Source.LastUse
    WHEN NOT MATCHED
        THEN INSERT (ObjectName, UseCount, LastUse, LastCache) 
        VALUES      (ObjectName, Executions, LastUse, LastCache);
    
    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    --  This just shows what you've logged so far
    --  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    SELECT * FROM [_ProcedureUseLog] ORDER BY UseCount DESC
    
    • 4
  5. Milica Medic Kiralj
    2014-06-02T07:30:27+08:002014-06-02T07:30:27+08:00

    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":

       USE DBName;
       SELECT 
    
           ao.[name] [Table],
           s.[name] [Schema],
           [create_date] [Created],
            [modify_date] [LastModified]
        FROM
             sys.all_objects ao JOIN sys.schemas s
               ON ao.schema_id = s.schema_id
        WHERE
             OBJECT_ID NOT IN (
                  SELECT OBJECT_ID
                  FROM sys.dm_db_index_usage_stats
            )
            AND [type] = 'P'
        ORDER BY
            [modify_date] DESC
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve