CORREÇÃO: Parcial resulta em uma consulta de um índice em cluster columnstore no SQL Server 2014

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3067257
Este artigo descreve um problema que ocorre durante uma consulta de um índice de cluster columnstore 2014 do Microsoft SQL Server. Este artigo fornece uma resolução para esse problema.
Sumário
Quando você usa uma consulta que examina um índice agrupado columnstore na 2014 do Microsoft SQL Server, você pode, em raras condições, receber resultados de consulta parcial.

Esse problema ocorre quando a operação a seguir é executada.
Etapa 1
Uma instrução Transact-SQL [INSERT ou inserção em MASSA] insere dados em uma tabela que tem columnstore índice agrupado. Durante a operação, as seguintes condições se aplicam:
  • Quando a instrução Transact-SQL atinge o limite de linhas, ele fecha linhas R1 cujo segmento S1.
  • Segmento S1 aponta para dicionário local D1.
  • A instrução continua a inserir linhas novas linhas R2.
  • Quando linhas R1 é fechada, o dicionário local D1 não tem também seja fechada. Se o dicionário D1 ainda tem espaço disponível, você pode deixá-la aberta e reutilizá-lo para as novas linhas R2.
Etapa 2
Se a instrução Transact-SQL é encerrada de forma anormal ou cancelada antes que ele fecha a novas linhas R2, as seguintes condições se aplicam:
  • As alterações de metadados ColumnStore ocorrerem em subtransactions confirmar independentemente a transação externa.
  • Neste ponto, linhas que R1 persistir na tabela do sistema em um "em construção" ou estado INVISÍVEL e segmento S1 referências dicionário D1.
  • Não há nenhuma linha criada na tabela de sistema para dicionário D1. Isso ocorre porque a instrução Transact-SQL nunca tem a oportunidade de fechar a linha existente. Portanto, a linha existente persiste.
Etapa 3
Em uma situação típica, se a tarefa de plano de fundo de mover tupla começa após o término da instrução Transact-SQL, a tarefa de plano de fundo remove as linhas invisíveis R1 e o segmento S1. Se uma nova instrução Transact-SQL é iniciada agora e cria linhas R3 que tem um novo segmento S3 que requer um novo dicionário local, você não pode reutilizar a identificação interna do dicionário D1. Isso ocorre porque o estado da memória do columnstore mantém o controle do dicionário de IDs que são usadas. Portanto, o segmento S3 fará referência novo dicionário D2.

Observação: A condição nesta etapa é uma condição comum. Portanto, nenhum dano ocorre.
Etapa 4
Se o SQL Server perde o estado na memória do dicionário D1 antes que a tarefa de mover tupla entra em vigor (e executa conforme descrito na etapa 3), o problema descrito neste artigo ocorre.

Observações:
  • Esse evento ocorre para qualquer um dos seguintes motivos:
    • SQL Server apresenta a sobrecarga de memória e o conteúdo da memória do dicionário D1 são removidos da memória.
    • A instância do SQL Server é reiniciada.
    • O banco de dados que contém o índice em cluster columnstore fica offline e depois fica online novamente.
  • Depois de qualquer um desses eventos ocorrer e SQL Server recarrega as estruturas de memória, há um registro que um dicionário D1 e interna ID existente. Isso ocorre porque o dicionário D1 não foi mantido nas tabelas do sistema quando a instrução Transact-SQL foi encerrada ou conceled.
  • Se a tarefa de plano de fundo de mover tupla começa nesse ponto, nenhum erro ocorrer porque se aplicam as condições descritas na etapa 3.
  • Se um nova linhas R3 é criada antes de inicia a tarefa de plano de fundo de mover tupla (de acordo com o item com marcador anterior), SQL Server atribui a mesma identificação interna para o novo dicionário D1 e faz referência dicionário D1 segmento S3 em linhas R3.
  • Quando a tarefa de plano de fundo de mover de tupla começa após a ação anterior, ele descarta invisíveis linhas R1 e seus segmentos S1 juntamente com o novo dicionário D1. Isso ocorre porque o movimentador de tupla considera esse novo dicionário D1 e o dicionário original D1 que S1 referências são os mesmos.

    Observação: Quando essa condição ocorre, não é possível consultar o conteúdo de linhas R3.
Resolução
O problema foi corrigido primeiramente nas seguintes atualizações cumulativas para o SQL Server:


A correção para esse problema também está incluída nas seguintes atualizações de distribuição geral (GDR) versão:

Atualização de segurança para o SQL Server de 2014 QFE
Esta atualização inclui 8 atualização cumulativa, essa correção importante e as atualizações de segurança necessárias MS15-058.

Atualização de segurança para o SQL Server de 2014 GDR
Esta atualização inclui essa correção importante e correções de segurança cumulativas através de MS15-058.

Atualização de nonsecurity para o SQL Server Service Pack 1 do 2014 GDR
Esta atualização inclui somente essa correção importante.

Sobre atualizações cumulativas para o SQL Server

Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Consulte as mais recentes atualizações cumulativas para o SQL Server:
Mais Informações

Mensagens de erro

Em um banco de dados afetado atualmente, se você executar o DBCC CHECKDB após você aplicar essa correção, você recebe seguinte mensagem de erro:
Msg 5289, nível 16, estado 1, linha 1
Cluster columnstore indexar cci na tabela ' t ' possui um ou mais valores de dados que não correspondem a valores de dados em um dicionário. Restaure os dados de um backup.

Em um banco de dados atualmente afetado quando você executa uma consulta que verifica as tabelas afetadas após você aplicar essa correção, você recebe a seguinte mensagem de erro:
Msg 5288, nível 16, estado 1, linha 1
Índice de ColumnStore tem um ou mais valores de dados que não correspondem a valores de dados em um dicionário. Execute DBCC CHECKDB para obter mais informações.

Se você receber esses erros, você pode salvar os dados não corrompidos por massa, exportando os dados das colunas afetadas/rowgroups e, em seguida, recarregar os dados depois que você solta ou cria o índice em cluster columnstore. Você deve ativar o sinalizador de rastreamento 10207 suprimir o erro 5288 e reverter para o comportamento antigo da ignorando rowgroups corrompido.

Observação: Mensagens de erro 5288 e 5289 são geradas para este linhas R3 cujo segmento S3. Sinalizador de rastreamento 10207 é usado para extrair os segmentos de linhas R3 não são afetados pelo dicionário faltando D1.

Consulta de bancos de dados afetados

Para determinar se o banco de dados que contém índices columnstore já é afetado por esse problema, execute a seguinte consulta:
select         object_name(i.object_id) as table_name,        i.name as index_name,        p.partition_number,        count(distinct s.segment_id) as damaged_rowgroups from        sys.indexes i        join sys.partitions p on p.object_id = i.object_id and p.index_id = i.index_id        join sys.column_store_row_groups g on g.object_id = i.object_id and g.index_id = i.index_id and g.partition_number = p.partition_number        join sys.column_store_segments s on s.partition_id = p.partition_id and s.segment_id = g.row_group_id where         i.type in (5, 6)        and s.secondary_dictionary_id <> -1         and g.state_description = 'COMPRESSED'        and s.secondary_dictionary_id not in        (               select dictionary_id from sys.column_store_dictionaries d               where d.hobt_id = p.hobt_id and d.column_id = s.column_id        ) group by         object_name(i.object_id),        i.name,        p.partition_number 

Observações:
  • Você tem que executar essa consulta em cada banco de dados que contém índices columnstore no servidor que está executando o SQL Server. Um conjunto de resultado vazio indica que o banco de dados não é afetado.
  • Executar esta consulta durante um período quando não há nenhuma atividade que criarão novos rowgroups ou alterar o estado do rowgroups existente. Por exemplo, as seguintes atividades podem modificar o estado do rowgroups: criação do índice, índice reorganizar, inserção em massa, mover de tupla compactação delta lojas.

    Antes de executar a consulta, você pode desativar a tarefa de mover de tupla de plano de fundo usando o sinalizador de rastreamento 634. Use esse comando para desativar a tarefa de plano de fundo: DBCC TRACEON (634, -1). Após a consulta termina a execução, lembre-se de habilitar novamente a tarefa em segundo plano usando o comando: DBCC TRACEOFF (634, -1).

    Verifique se não há nenhum comando BULK INSERT/BCP/SELECT-para inserir dados em tabelas que usam columnstore índice enquanto a consulta está sendo executado.

    É recomendável usar estas etapas para impedir que a consulta retornar falso-positivos.
Situação
A Microsoft confirma que este é um problema em seus produtos listados na seção "Aplica-se a".

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3067257 - Última Revisão: 07/26/2015 07:54:00 - Revisão: 3.0

Microsoft SQL Server 2014 Service Pack 1, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard

  • kbqfe kbsurveynew kbexpertiseadvanced kbfix kbmt KB3067257 KbMtpt
Comentários