CORRECÇÃO: Erro de estouro aritmético ocorre intermitentemente durante a fase "Coletar um instantâneo sys.dm_exec_query_stats" depois habilitado Coletores de dados no SQL Server 2008

Traduções deste artigo Traduções deste artigo
ID do artigo: 975915 - Exibir os produtos aos quais esse artigo se aplica.
A Microsoft distribui correções do Microsoft SQL Server 2008 como um arquivo para download. Porque as correções são cumulativas, cada versão nova contém todos os hotfixes e todas as correções de segurança que foram incluídas com o SQL Server 2008 anteriores corrigir lançamento.
Expandir tudo | Recolher tudo

Sintomas

Considere o cenário a seguir.
  • Habilitar o coletor de dados.
  • Sob uma carga de trabalho pesada ou prolongada, quando o coletor de dados é executado, atividade de manutenção de banco de dados em bancos de dados muito grandes, como reconstruir índices e atualizar estatísticas, pode levar a erro de estouro aritmético como segue. Esse erro de estouro aritmético ocorre intermitentemente durante a coleta um instantâneo da fase de sys.dm_exec_query_stats.
Mensagem: Código de erro do SSIS DTS_E_OLEDBERROR. Erro de OLE. Código de erro: 0x80040E57.
Um registro de OLE está disponível. Fonte: "Microsoft SQL Server Native Client 10.0" HRESULT: 0x80040E57 Descrição: "Erro de estouro aritmético convertendo expressão para o tipo de dados int.".

Se você aumentar o nível de log do coletor de dados para 2 (por exemplo, executar o "exec sp_syscollector_update_collection_set @ collection_set_id = <collectionsetid>, @ logging_level = 2" instrução), as seguintes mensagens de erro são retornadas:
<Data Hora > SEQ - capturar e analisar estatísticas de consulta e plano de consulta e texto, erro, 6569,,, DTS_E_OLEDBERROR de código de erro do SSIS. Erro de OLE. Código de erro: 0x80040E57. <nl/> registro de um OLE está disponível. Fonte: "Microsoft SQL Server Native Client 10.0" HRESULT: 0x80040E57 Descrição: "Erro de estouro aritmético convertendo expressão para o tipo de dados int.".,, < Data Hora >,, < Data Hora >,,, OnError,-1071636471 < Data Hora > QueryActivityUpload, erro, 6569,,, DTS_E_OLEDBERROR de código de erro do SSIS. Erro de OLE. Código de erro: 0x80040E57. <nl/> registro de um OLE está disponível. Fonte: "Microsoft SQL Server Native Client 10.0" HRESULT: 0x80040E57 Descrição: "Erro de estouro aritmético convertendo expressão para o tipo de dados int.".,, < Data Hora >,, < Data Hora >,,, OnError,-1071636471

<Data Hora > DFT - criar interessantes consultas carregar lote, erro, 6569,,, componente "ODS - Get instantâneo atual de dm_exec_query_stats" código de erro Falha fase pre-execute e retornado (16412) 0xC0202009.,, < Data Hora >,, < Data Hora >,,, OnError,-1073450982

<Data Hora > SEQ - capturar e analisar estatísticas de consulta e consulta plano e texto, erro, 6569,,, componente "ODS - Get instantâneo atual de dm_exec_query_stats" código de erro Falha fase pre-execute e retornado (16412) 0xC0202009.,, < Data Hora >,, < Data Hora >,,, OnError,-1073450982

<Data Hora > QueryActivityUpload, erro, 6569,,, componente "ODS - Get instantâneo atual de dm_exec_query_stats" código de erro Falha fase pre-execute e retornado (16412) 0xC0202009.,, < Data Hora >,, < Data Hora >,,, OnError,-1073450982


Nesse cenário, a seguinte instrução é executada pelo SQL Server causa o erro de estouro aritmético:
SET NOCOUNT ON
DECLARE @p1 datetime
SET @p1 = GETDATE()

SELECT 
    [sql_handle],
    statement_start_offset,
    statement_end_offset,
    -- Use ISNULL here and in other columns to handle in-progress queries that are not yet in sys.dm_exec_query_stats.  
    -- These values only come from sys.dm_exec_query_stats. If the plan does not show up in sys.dm_exec_query_stats 
    -- (first execution of a still-in-progress query, visible in sys.dm_exec_requests), these values will be NULL. 
    MAX (plan_generation_num) AS plan_generation_num,
    plan_handle,
    MIN (creation_time) AS creation_time, 
    MAX (last_execution_time) AS last_execution_time,
    SUM (execution_count) AS execution_count,
    SUM (total_worker_time) AS total_worker_time,
    MIN (min_worker_time) AS min_worker_time,           -- NULLable
    MAX (max_worker_time) AS max_worker_time,
    SUM (total_physical_reads) AS total_physical_reads,
    MIN (min_physical_reads) AS min_physical_reads,     -- NULLable
    MAX (max_physical_reads) AS max_physical_reads,
    SUM (total_logical_writes) AS total_logical_writes,
    MIN (min_logical_writes) AS min_logical_writes,     -- NULLable
    MAX (max_logical_writes) AS max_logical_writes,
    SUM (total_logical_reads) AS total_logical_reads,
    MIN (min_logical_reads) AS min_logical_reads,       -- NULLable
    MAX (max_logical_reads) AS max_logical_reads,
    SUM (total_clr_time) AS total_clr_time,
    MIN (min_clr_time) AS min_clr_time,                 -- NULLable
    MAX (max_clr_time) AS max_clr_time,
    SUM (total_elapsed_time) AS total_elapsed_time,
    MIN (min_elapsed_time) AS min_elapsed_time,         -- NULLable
    MAX (max_elapsed_time) AS max_elapsed_time,
    @p1 AS collection_time
FROM
(
    SELECT  
        [sql_handle],
        statement_start_offset,
        statement_end_offset,
        plan_generation_num,
        plan_handle,
        creation_time,
        last_execution_time,
        execution_count,
        total_worker_time,
        min_worker_time,
        max_worker_time,
        total_physical_reads,
        min_physical_reads,
        max_physical_reads,
        total_logical_writes,
        min_logical_writes,
        max_logical_writes,
        total_logical_reads,
        min_logical_reads,
        max_logical_reads,
        total_clr_time,
        min_clr_time,
        max_clr_time,
        total_elapsed_time,
        min_elapsed_time,
        max_elapsed_time 
    FROM sys.dm_exec_query_stats AS q
    -- Temporary workaround for VSTS #91422.  This should be removed if/when sys.dm_exec_query_stats reflects in-progress queries. 
    UNION ALL 
    SELECT 
        r.[sql_handle],
        r.statement_start_offset,
        r.statement_end_offset,
        ISNULL (qs.plan_generation_num, 0) AS plan_generation_num,
        r.plan_handle,
        ISNULL (qs.creation_time, r.start_time) AS creation_time,
        r.start_time AS last_execution_time,
        1 AS execution_count,
        -- dm_exec_requests shows CPU time as ms, while dm_exec_query_stats 
        -- uses microseconds.  Convert ms to us. 
        r.cpu_time * 1000 AS total_worker_time,
        qs.min_worker_time,     -- min should not be influenced by in-progress queries
        r.cpu_time * 1000 AS max_worker_time,
        r.reads AS total_physical_reads,
        qs.min_physical_reads,  -- min should not be influenced by in-progress queries
        r.reads AS max_physical_reads,
        r.writes AS total_logical_writes,
        qs.min_logical_writes,  -- min should not be influenced by in-progress queries
        r.writes AS max_logical_writes,
        r.logical_reads AS total_logical_reads,
        qs.min_logical_reads,   -- min should not be influenced by in-progress queries
        r.logical_reads AS max_logical_reads,
        qs.total_clr_time,      -- CLR time is not available in dm_exec_requests
        qs.min_clr_time,        -- CLR time is not available in dm_exec_requests
        qs.max_clr_time,        -- CLR time is not available in dm_exec_requests
        -- dm_exec_requests shows elapsed time as ms, while dm_exec_query_stats 
        -- uses microseconds.  Convert ms to us. 
        r.total_elapsed_time * 1000 AS total_elapsed_time,
        qs.min_elapsed_time,    -- min should not be influenced by in-progress queries
        r.total_elapsed_time * 1000 AS max_elapsed_time
    FROM sys.dm_exec_requests AS r 
    LEFT OUTER JOIN sys.dm_exec_query_stats AS qs ON r.plan_handle = qs.plan_handle AND r.statement_start_offset = qs.statement_start_offset 
        AND r.statement_end_offset = qs.statement_end_offset 
    WHERE r.sql_handle IS NOT NULL 
) AS query_stats 
OUTER APPLY sys.dm_exec_sql_text (sql_handle) AS sql
GROUP BY [sql_handle], plan_handle, statement_start_offset, statement_end_offset 
ORDER BY [sql_handle], plan_handle, statement_start_offset, statement_end_offset
portanto, se você executar essa instrução manualmente, você também pode receber a seguinte mensagem de erro:
Msg 8115, nível 16, estado 2,
Erro de estouro aritmético convertendo expressão para o tipo de dados int

Resolução

Primeiro, a correção para esse problema foi lançada em 5 de atualizações cumulativas para o SQL Server 2008 Service Pack 1. Para obter mais informações sobre esse pacote cumulativo de atualização, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
975977Pacote de atualizações cumulativas 5 para SQL Server 2008 Service Pack 1
Observação Como as compilações são cumulativas, cada novo lançamento de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o SQL Server 2008 anteriores corrigir lançamento. A Microsoft recomenda que você considere aplicar o lançamento mais recente de correção que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
970365Compilações de SQL Server 2008 que foram lançadas após o lançamento do SQL Server 2008 Service Pack 1
Microsoft SQL Server 2008 hotfixes são criados para específicos de service packs do SQL Server. Você deve aplicar um hotfix do SQL Server 2008 Service Pack 1 para uma instalação do SQL Server 2008 Service Pack 1. Por padrão, qualquer hotfix é fornecido no service pack do SQL Server está incluído no service pack próximo do SQL Server.

Situação

A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicar a".

Referências

Para obter mais informações sobre o modelo de serviços incrementais para SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
935897Um modelo de serviços incrementais está disponível da equipe do SQL Server para fornecer hotfixes para problemas relatados


Para obter mais informações sobre o esquema para nomeação para atualizações do SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
822499Novo esquema para nomeação dos pacotes de atualização de software Microsoft SQL Server


Para obter mais informações sobre a terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento:
824684Descrição da terminologia padrão usada para descrever as atualizações de software

Propriedades

ID do artigo: 975915 - Última revisão: segunda-feira, 16 de novembro de 2009 - Revisão: 1.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Workgroup
Palavras-chave: 
kbmt kbexpertiseadvanced kbsurveynew kbqfe kbfix KB975915 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 975915

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com