none
Histórico de Consultas SQL SERVER RRS feed

  • Pergunta

  • Bom Dia

    Gostaria de saber se no sql server 2008 eu consigo via dmvs saber se em determinado momento houve excesso de conexões no banco de dados, blocking, qual foi o lider dos bloqueios, histórico de tempos de execução de uma procedure, memory grants, quais foram os planos de execução anteriores para o mesmo statement, existe este armazenamento no SQL SERVER 2008 R2, ou terei que criar um, existe um how to para isso? Criar um repositório com estas informações para posterior consulta e identificar cauza raiz para relatar em postmorten.

    Grato,

    Maurício

    terça-feira, 26 de abril de 2016 10:50

Respostas

  • Maumauboy,

    Você já verificou nos logs no SQL Server?

    Estou acreditando que seja falta de memória em cache para armazenar e posteriormente processar a sua query.

    Por outro lado sei da existência de um bug na versão 2008 do SQL Server justamente similar ao seu cenário, veja se este post ajuda: https://support.microsoft.com/en-us/kb/982854

    Você tem qual service pack instalado neste SQL Server?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    quinta-feira, 28 de abril de 2016 13:48
    Moderador

Todas as Respostas

  • Maumauboy,

    Sim é possível através do uso de Extended Events em alguns cenários combinando com views e dmvs.

    Veja neste exemplo, como obter informações sobre o tempo médio de uso de CPU:

    SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
        SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
            ((CASE qs.statement_end_offset
              WHEN -1 THEN DATALENGTH(st.text)
             ELSE qs.statement_end_offset
             END - qs.statement_start_offset)/2) + 1) AS statement_text
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    ORDER BY total_worker_time/execution_count DESC;

    Neste outro como obter informações sobre transações em cache:

    SELECT QT.text,
                 QP.query_plan,
                 QS.execution_count,
                 QS.total_elapsed_time,
                 QS.last_elapsed_time,
                 QS.total_logical_reads
    FROM sys.dm_exec_query_stats as QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as QT
     CROSS APPLY sys.dm_exec_query_plan (QS.plan_handle) as QP
    ORDER BY QS.execution_count DESC

    Este outro mesmo informações sobre as querys em execução:

    SELECT 
      DES.SESSION_ID,
      DES.CPU_TIME,
      DES.READS,
      DES.WRITES,
      DES.LOGICAL_READS,
      DES.ROW_COUNT,
      DER.SESSION_ID,
      DES.STATUS,
      DES.HOST_NAME,
      DES.PROGRAM_NAME,
      DES.LOGIN_NAME,
      DES.ORIGINAL_LOGIN_NAME, 
      DEC.CLIENT_NET_ADDRESS,
      DEC.AUTH_SCHEME,
      DEC.NET_TRANSPORT,
      SUBSTRING(T.[TEXT], DER.[STATEMENT_START_OFFSET] / 2, 
    	COALESCE(NULLIF(DER.[STATEMENT_END_OFFSET], - 1) / 2, 2147483647)) AS COMANDO
    FROM
     SYS.DM_EXEC_SESSIONS AS DES 
      INNER JOIN SYS.DM_EXEC_REQUESTS DER
       ON DER.BLOCKING_SESSION_ID = DES.SESSION_ID
      INNER JOIN SYS.DM_EXEC_CONNECTIONS DEC  
       ON DEC.SESSION_ID = DES.SESSION_ID
      INNER JOIN SYS.DM_EXEC_REQUESTS DER2
       ON DER2.SESSION_ID = DES.SESSION_ID
       CROSS APPLY SYS.DM_EXEC_SQL_TEXT(DER.[SQL_HANDLE]) AS T
    GO

    Por último, um exemplo de como obter informações sobre a ocorrência de backups:

    -- When SQL Server Backups Occurred --
    DECLARE @path NVARCHAR(260)
    
    SELECT @path=path FROM sys.traces WHERE is_default = 1
    
    --Security Audit: Audit Backup Event
    SELECT DatabaseName, TextData, 
           Duration, StartTime, 
    	   EndTime, SPID, 
    	   ApplicationName, LoginName   
    FROM sys.fn_trace_gettable(@path, DEFAULT)
    WHERE EventClass IN (115) 
    and EventSubClass=1
    ORDER BY StartTime DESC


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 26 de abril de 2016 23:33
    Moderador
  • Bom Dia

    O problema ocorreu no dia 22/04 entre 11:00 e 11:30 , o erro ocorrido foi o seguinte:

    There is insufficient system in resource pool 'internal' to run this query.

    Me parece que podem ter ocorrido dois problemas.

    1- Falta de memória por excesso de conexões com memory grants específicos.

    2- Falta de memória por consumo alto no buffer cache por uma determinada consulta.

    Preciso do histórico entre 11:00 e 11:30 do dia 22 para saber se houve excesso de sessões com memory grants específicos ou uma só query que consumiu mais memória naquele horário, poderia ter sido até mesmo somente uma query ad-hoc.

    Ou seja,

    Como posso identificar a query entre 11:00 e 11:30 do dia 22 que supostamente poderia ter consumido mais memória?

    Como posso saber se houve um número elevado de conexões simultaneas com determinados memory grants?

    É necessária alguma implementação adicional para chegar a este objetivo?

    Afinal, desde o dia 22 o problema não ocorreu mais e também não ocorreu antes do incidente, preciso saber qual é foi a possível mudança no Workload naquele horário para buscar identificar a causa raiz.

    Grato,

    Maurício

    quarta-feira, 27 de abril de 2016 12:17
  • Maumauboy,

    Você já verificou nos logs no SQL Server?

    Estou acreditando que seja falta de memória em cache para armazenar e posteriormente processar a sua query.

    Por outro lado sei da existência de um bug na versão 2008 do SQL Server justamente similar ao seu cenário, veja se este post ajuda: https://support.microsoft.com/en-us/kb/982854

    Você tem qual service pack instalado neste SQL Server?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    quinta-feira, 28 de abril de 2016 13:48
    Moderador
  • Junior

    Obrigado pela sua ajuda até o momento, peguei o erro no log

    THERE IS INSUFFICIENT SYSTEM MEMORY IN RESOURCE POOL 'INTERNAL' TO RUN THIS QUERY.

    Porém preciso de uma coleta onde eu possa encontrar esta query voltando no tempo. Neste caso no dia 22 entre 11 e 11:30.

    Grato,

    Maurício

    sábado, 30 de abril de 2016 11:18
  • Maumauboy,

    Verifique se a system function fn_dblog não seria o possível solução.

    Mas você tem ideia de qual seria esta query?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta maumauboy quinta-feira, 12 de maio de 2016 17:04
    • Não Marcado como Resposta maumauboy quinta-feira, 12 de maio de 2016 17:04
    sábado, 30 de abril de 2016 14:38
    Moderador
  • JUNIOR

    NÃO TENHO IDÉIA, O IDEAL SERIA COLETAR INFORMAÇÕES A TAL PONTO DE CONFERI-LAS POSTERIORMENTE E CHEGAR O MAIS PERTO POSSÍVEL DA CAUSA RAIZ DO PROBLEMA.

    GRATO,

    MAURÍCIO

    quinta-feira, 12 de maio de 2016 17:05
  • Junior

    Obrigado pela ajuda, vou montar alguma rotina para quardar histórico de sessões ativas.

    Obrigado!

    sábado, 14 de maio de 2016 10:52