CORRECÇÃO: Resultados parciais numa consulta de um índice agrupado columnstore no SQL Server 2014

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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 3067257
Este artigo aborda um problema que ocorre durante uma consulta de um índice agrupado columnstore no Microsoft SQL Server 2014. Este artigo fornece uma resolução para este problema.
Sumário
Quando utiliza uma consulta que pesquisa um índice agrupado columnstore no Microsoft SQL Server 2014, poderá, em raras circunstâncias, receber resultados da consulta parcial.

Este problema ocorre quando a seguinte operação é executada.
Passo 1
Uma instrução Transact-SQL [inserir ou inserção em massa] insere dados numa tabela que tenha agrupado índice de columnstore. Durante esta operação, são aplicáveis as seguintes condições:
  • Quando a instrução Transact-SQL atinge o limiar de rowgroup, fecha-se rowgroup R1 que tenha segmento S1.
  • Segmento S1 aponta para o dicionário local D1.
  • A instrução continua a inserir linhas para rowgroup nova R2.
  • Quando rowgroup R1 é fechada, o dicionário local D1 não ter de ser fechadas. Se o dicionário D1 ainda tem espaço disponível, poderá deixá-la aberta e reutilizá-la para o novo rowgroup R2.
Passo 2
Se a instrução Transact-SQL é terminou de forma anormal ou cancelada antes de fecha-se a nova rowgroup R2, são aplicáveis as seguintes condições:
  • Ocorrência de alterações de metadados de Columnstore na subtransactions consolidar independentemente da transacção externa.
  • Neste momento, rowgroup que R1 persistir na tabela de sistema um "em construção" ou estado INVISÍVEL e segmento S1 referencia dicionário D1.
  • Não existe nenhuma linha criada na tabela de sistema para o dicionário D1. Isto acontece porque a instrução Transact-SQL nunca necessita de uma oportunidade para fechar a linha existente. Por conseguinte, a linha existente persiste.
Passo 3
Numa situação normal, se a tarefa de segundo plano do Movimentador de tuple é iniciado depois de termina a instrução Transact-SQL, a tarefa de segundo plano remove o rowgroup invisível R1 e o segmento S1. Se uma nova instrução Transact-SQL é iniciada agora e cria rowgroup R3 que tem um novo segmento S3 que requer um novo dicionário local, não é possível reutilizar o ID interno do dicionário D1. Isto acontece porque o estado da memória da columnstore mantém um registo do dicionário de IDs de que são utilizados. Por conseguinte, segmento S3 irá referenciar o novo dicionário D2.

Nota A condição neste passo é uma condição comuns. Por conseguinte, não danificado.
Passo 4
Se o SQL Server perder o estado da memória do dicionário D1 antes da tarefa de Movimentador de tuple entra em vigor (e executa, tal como descrito no passo 3), ocorre o problema descrito neste artigo.

Notas
  • Este evento ocorre para qualquer um dos seguintes motivos:
    • SQL Server tiver sobrecarga de memória e o conteúdo da memória do dicionário D1 sejam retirados de memória.
    • A instância do SQL Server é reiniciada.
    • A base de dados que contém o índice de columnstore em cluster fica offline e, em seguida, fica novamente online.
  • Depois de qualquer um dos seguintes eventos ocorrem e SQL Server Recarrega as estruturas de memória, não existe nenhum registo que um dicionário D1 e internas ID existia. Isto acontece porque o dicionário D1 não foi mantido das tabelas de sistema quando a instrução Transact-SQL foi terminada ou conceled.
  • Se a tarefa de segundo plano do Movimentador de tuple for iniciado neste momento, não os erros que ocorrem uma vez que as condições descritas no passo 3 são aplicáveis.
  • Se for criado um novo rowgroup R3 antes de inicia a tarefa de segundo plano do Movimentador de cadeia de identificação (por produto de marca anterior), SQL Server atribui o mesmo ID interno ao novo dicionário D1 e referencia dicionário D1 para no segmento de S3 rowgroup R3.
  • Quando a tarefa de segundo plano do Movimentador de tuple é iniciado após a acção anterior, desce rowgroup invisível R1 e os seus segmentos S1 em conjunto com o novo dicionário D1. Isto ocorre porque o Movimentador de tuple considera esse novo dicionário D1 e o dicionário original D1 que S1 referências são os mesmos.

    Nota Quando esta condição ocorre, não é possível consultar o conteúdo do rowgroup R3.
Resolução
O problema foi primeiro corrigido nas seguintes actualizações cumulativas para o SQL Server:


A correcção para este problema também está incluída nas actualizações de versão (GDR) de distribuição geral seguinte:

Actualização de segurança do SQL Server 2014 QFE
Esta actualização inclui 8 actualização cumulativa, esta correcção de importante e actualizações de segurança MS15-058 necessárias.

Actualização de segurança para o SQL Server 2014 GDR
Esta actualização inclui esta correcção de importante e correcções de segurança cumulativa através de MS15-058.

Actualização não relacionada com segurança para o SQL Server 2014 Service Pack 1 GDR
Esta actualização inclui apenas esta correcção de importante.

Acerca de actualizações cumulativas para o SQL Server

Cada nova actualização cumulativa para o SQL Server contém todas as correcções e todas as correcções de segurança que foram incluídas na anterior actualização cumulativa. Consulte as mais recentes actualizações cumulativas para o SQL Server:
Mais Informação

Mensagens de erro

Numa base de dados actualmente afectado, se executar DBCC CHECKDB depois de aplicar esta correcção, pode recebe a seguinte mensagem de erro:
Erro 5289, nível de 16. o, o estado 1, linha 1
Columnstore em cluster indexar ICC na tabela ' t ' tem um ou mais valores de dados que não correspondem a valores de dados num dicionário. Restaure os dados a partir de uma cópia de segurança.

Numa base de dados actualmente afectado, quando executa uma consulta que pesquisa as tabelas afectadas depois de aplicar esta correcção, recebe a seguinte mensagem de erro:
Erro 5288, nível de 16. o, o estado 1, linha 1
Índice de Columnstore tem um ou mais valores de dados que não correspondem a valores de dados num dicionário. Volte a executar DBCC CHECKDB para obter mais informações.

Se receber estes erros, pode guardar os dados não danificados em massa a exportar os dados das colunas afectadas/rowgroups e, em seguida, recarregar os dados depois de largar ou criar o índice de columnstore em cluster. Deve activar o sinalizador de rastreio 10207 suprimir o erro de 5288 e reverter para o antigo comportamento de ignorar rowgroups danificado.

Nota Mensagens de erro 5288 e 5289 são geradas para este rowgroup R3 que tenha segmento S3. Sinalizador de rastreio 10207 é utilizado para extrair os segmentos do rowgroup R3 que não são afectados pelo dicionário em falta D1.

Consulta de bases de dados afectadas

Para determinar se a base de dados que contém columnstore índices já tenha sido afectado por este problema, execute a consulta seguinte:
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 

Notas
  • Tem de executar esta consulta cada base de dados que contém índices de columnstore no servidor que esteja a executar o SQL Server. Um conjunto de resultado vazio indica que a base de dados não é afectada.
  • Executar esta consulta durante um período quando houver actividade que irá criar novas rowgroups ou alterar o estado de rowgroups existentes. Por exemplo, as seguintes actividades podem modificar o estado do rowgroups: a compilação de índice, índice reorganizar, inserção em massa, Movimentador de tuple compressão delta arquivos.

    Antes de executar a consulta pode desactivar a tarefa de Movimentador de cadeia de identificação de segundo plano utilizando o sinalizador de rastreamento 634. Utilize este comando para desactivar a tarefa de segundo plano: DBCC TRACEON (634, -1). Após conclusão da consulta em execução, não se esqueça de voltar a activar a tarefa de segundo plano utilizando o comando: DBCC TRACEOFF (634, -1).

    Certifique-se também não existem comandos em massa inserir/BCP/SELECT-para inserir dados em tabelas que utilizam o índice de columnstore enquanto esta consulta está em execução.

    Recomenda-se utilizar estes passos para impedir que a consulta devolver falsos positivos.
Ponto Da Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secçã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