Iniciar sessão com a Microsoft
Iniciar sessão ou criar uma conta.
Olá,
Selecione uma conta diferente.
Tem várias contas
Selecione a conta com a qual pretende iniciar sessão.

Este artigo discute um problema que ocorre durante uma consulta de um índice de loja de colunas agrupado no Microsoft SQL Server 2014. Este artigo fornece uma resolução para este problema.

Resumo

Quando utilizar uma consulta que digitaliza um índice de loja de colunas agrupado no Microsoft SQL Server 2014, poderá, em condições raras, receber resultados parciais de consulta. Este problema ocorre quando a seguinte operação é executada.

Passo 1

Uma declaração Transact-SQL [INSERT ou BULK-INSERT] insere dados numa tabela que tem índice de loja de colunas agrupado. Durante esta operação, aplicam-se as seguintes condições:

  • Quando a declaração Transact-SQL atinge o limiar do grupo de linha, fecha o grupo de linha R1 que tem o segmento S1.

  • O segmento S1 aponta para o dicionário local D1.

  • A declaração continua a inserir linhas para o novo grupo de linha R2.

  • Quando o grupo de remo R1 está fechado, o dicionário local D1 também não tem de ser fechado. Se o dicionário D1 ainda tiver espaço disponível, pode deixá-lo aberto e reutilizá-lo para o novo grupo de linha R2.

Passo 2

Se a declaração Transact-SQL terminar anormalmente ou ser cancelada antes de encerrar o novo grupo de linha R2, aplicam-se as seguintes condições:

  • As mudanças nos metadados da loja de colunas ocorrem em subtransacções que se comprometem independentemente da transação exterior.

  • Neste ponto, o grupo de linha R1 persiste na tabela do sistema em estado "em construção" ou invisível, e segmento S1 referencia o dicionário D1.

  • Não há nenhuma linha criada na tabela do sistema para o dicionário D1. Isto porque a declaração Transact-SQL nunca tem a oportunidade de fechar a linha existente. Portanto, a linha existente persiste.

Passo 3

Numa situação típica, se a tarefa de fundo do tuple mover começar após o fim da declaração Transact-SQL, a tarefa de fundo remove o grupo de linha invisível R1 e o segmento S1. Se uma nova declaração Transact-SQL for iniciada agora e criar o grupo de linha 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 porque o estado de memória da loja de colunas acompanha os IDs do dicionário que são usados. Portanto, o segmento S3 fará referência ao novo dicionário D2.Nota A condição neste passo é uma condição comum. Portanto, não ocorre corrupção.

Passo 4

Se o SQL Server perder o estado de memória do dicionário D1 antes da tarefa de tuple mover entrar em vigor (e executar como descrito no Passo 3), o problema descrito neste artigo ocorre.Notas

  • Este evento ocorre por qualquer uma das seguintes razões:

    • O SQL Server experimenta uma sobrecarga de memória e os conteúdos na memória do dicionário D1 são despejados da memória.

    • A instância do SQL Server é reiniciada.

    • A base de dados que contém o índice de loja de colunas agrupado fica offline e depois volta a estar online.

  • Após qualquer um destes eventos ocorrer e o SQL Server recarregar as estruturas de memória, não há registo de que exista um Dicionário D1 e o seu ID interno. Isto porque o dicionário D1 não foi retido nas tabelas do sistema quando a declaração Transact-SQL foi encerrada ou conceled.

  • Se a tarefa de fundo do tuple mover começar neste ponto, não ocorrem erros porque as condições descritas no passo 3 se aplicam.

  • Se um novo grupo de linha R3 for criado antes do início da tarefa de fundo do tuple mover (de acordo com o item de bala anterior), o SQL Server atribui o mesmo ID interno ao novo dicionário D1, e faz referência ao dicionário D1 para o segmento S3 no grupo de linha R3.

  • Quando a tarefa de fundo do tuple mover começa após a ação anterior, deixa cair o grupo de linha invisível R1 e os seus segmentos S1 juntamente com o novo dicionário D1. Isto ocorre porque o tuple mover considera que o novo dicionário D1 e o dicionário original D1 que referências S1 são as mesmas.Nota Quando esta condição ocorre, não é possível consultar o conteúdo do grupo de linha R3.

Resolução

O problema foi corrigido pela primeira vez nas seguintes atualizações cumulativas para o SQL Server:

Atualização Cumulativa 1 para SQL Server 2014 SP1 Atualização Cumulativa 8 para SQL Server 2014A correção para este problema também está incluída nas seguintes atualizações gerais de libertação de distribuição (RDA):

Atualização de segurança para SQL Server 2014 QFE  Esta atualização inclui a Atualização Cumulativa 8, esta importante correção e as atualizações de segurança necessárias para o MS15-058.Atualização de segurança para SQL Server 2014 GDR  Esta atualização inclui esta importante correção e correções de segurança cumulativas através do MS15-058.Atualização de não segurança para SQL Server 2014 Service Pack 1 GDR  Esta atualização inclui apenas esta importante correção.

Cada nova atualização cumulativa do 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 últimas atualizações cumulativas para o SQL Server:

Mais Informações

Mensagens de erroNuma base de dados atualmente afetada, se executar o DBCC CHECKDB depois de aplicar esta correção, recebe a seguinte mensagem de erro:

Msg 5289, Nível 16, Estado 1, Linha 1 Índice de colunas agrupadas 'cci' na tabela 't' tem um ou mais valores de dados que não correspondem aos valores de dados num dicionário. Restaurar os dados a partir de uma cópia de segurança.

Numa base de dados atualmente afetada, quando faz uma consulta que digitaliza as tabelas afetadas após a aplicação desta correção, recebe a seguinte mensagem de erro:

Msg 5288, Nível 16, Estado 1, Índice de Colunas 1 tem um ou mais valores de dados que não correspondem aos valores de dados num dicionário. Por favor, verifique o DBCC CHECKDB para mais informações.

Se receber estes erros, pode guardar os dados não corroborados exportando em massa os dados de colunas/grupos de linha não afetados e, em seguida, recarregando os dados após a queda ou criar o índice de loja de colunas agrupados. Deve permitir que o Trace flag 10207 suprima o erro 5288 e volte ao comportamento antigo de saltar grupos de linha corruptos. NotaAs mensagens de erro 5288 e 5289 são geradas para este grupo de linha R3 que tem o segmento S3. A bandeira de traço 10207 é utilizada para extrair os segmentos do grupo de remo R3 que não são afetados pelo dicionário em falta D1.

Consulta para bases de dados afetadasPara determinar se a base de dados que contém índices de lojas de colunas já está afetada por este 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 

Notas

  • Tem de executar esta consulta em todas as bases de dados que contenham índices de loja de colunas no servidor que está a executar o SQL Server. Um conjunto de resultados vazio indica que a base de dados não é afetada.

  • Execute esta consulta durante um período em que não exista atividade que crie novos grupos de linha ou altere o estado dos grupos de linha existentes. Por exemplo, as seguintes atividades podem modificar o estado dos grupos de linha: construção de índices, reorganização de índices, inserção a granel, tuple mover comprimindo lojas delta. Antes de executar a consulta, pode desativar a tarefa de mudança de tuple de fundo utilizando a bandeira de traço 634. Utilize este comando para desativar a tarefa de fundo: DBCC TRACEON (634 , -1 ). Após a execução da consulta, lembre-se de voltar a ativar a tarefa de fundo utilizando o comando: DBCC TRACEOFF (634 , -1 ). Certifique-se também de que não existem comandos DE INSERÇÃO A GRANEL/BCP/SELECT-INTO que inserem dados nas tabelas que utilizam o índice de loja de colunas enquanto esta consulta está em execução. Recomenda-se a utilização destes passos para evitar que a consulta devolva falsos positivos.

Estado

A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.

Estas informações foram úteis?

Quão satisfeito está com a qualidade do idioma?
O que afetou a sua experiência?
Ao selecionar submeter, o seu feedback será utilizado para melhorar os produtos e serviços da Microsoft. O seu administrador de TI poderá recolher estes dados. Declaração de Privacidade.

Obrigado pelo seu feedback!

×