KB3067257 – ÅTGÄRDAT: Delresultat i en fråga för ett grupperat columnstore-index i SQL Server 2014

Gäller för
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

I den här artikeln beskrivs ett problem som uppstår vid en fråga i ett grupperat columnstore-index i Microsoft SQL Server 2014. Den här artikeln innehåller en lösning på det här problemet.

Sammanfattning

När du använder en fråga som söker igenom ett grupperat columnstore-index i Microsoft SQL Server 2014 kan du i sällsynta fall få partiella frågeresultat.

Det här problemet uppstår när följande åtgärd körs.

Steg 1

En Transact-SQL-instruktion [INSERT eller BULK-INSERT] infogar data i en tabell som har grupperat columnstore-index. Under den här åtgärden gäller följande villkor:

  • När Transact-SQL-instruktionen når rowgroup-tröskelvärdet stänger den radgrupp R1 som har segment S1.
  • Segment S1 pekar på den lokala ordlistan D1.
  • Satsen fortsätter att infoga rader i den nya radgruppen R2.
  • När radgrupp R1 är stängd behöver inte den lokala ordlistan D1 också vara stängd. Om det fortfarande finns utrymme för ordlista D1 kan du lämna den öppen och återanvända den för den nya radgruppen R2.

Steg 2

Om Transact-SQL-instruktionen avslutas på ett onormalt sätt eller avbryts innan den stänger den nya radgruppen R2 gäller följande villkor:

  • Ändringar av columnstore-metadata sker i deltransaktioner som checkas in oberoende av den yttre transaktionen.
  • I det här läget finns radgrupp R1 kvar i systemtabellen i tillståndet "under konstruktion" eller i tillståndet OSYNLIG, och segmentet S1 refererar till ordlista D1.
  • Det finns ingen rad skapad i systemtabellen för ordlista D1. Det beror på att Transact-SQL-instruktionen aldrig har möjlighet att stänga den befintliga raden. Därför finns den befintliga raden kvar.

Steg 3

I en typisk situation, om bakgrundsaktiviteten för tuple mover startar efter att Transact-SQL-instruktionen har avslutats, tar bakgrundsaktiviteten bort den osynliga radgruppen R1 och segmentet S1. Om en ny Transact-SQL-instruktion startas nu och skapar radgrupp R3 som har ett nytt segment S3 som kräver en ny lokal ordlista kan du inte återanvända det interna ID:t för ordlista D1. Det beror på att det minnesinterna tillståndet för columnstore håller reda på de ordliste-ID:t som används. Därför kommer segment S3 att referera till den nya ordlistan D2.

Obs! Villkoret i det här steget är ett vanligt villkor. Därför förekommer ingen skada.

Steg 4

Om SQL Server förlorar det minnesinterna tillståndet för ordlista D1 innan tupelflyttaruppgiften börjar gälla (och utför enligt beskrivningen i steg 3) uppstår problemet som beskrivs i den här artikeln.

Anteckningar

  • Den här händelsen inträffar av någon av följande orsaker:

    • SQL Server upplever minnesöverbelastning och innehållet i minnet i ordlistan D1 avlägsnas från minnet.
    • Instansen av SQL Server startas om.
    • Databasen som innehåller det grupperade columnstore-indexet tas offline och tas sedan online igen.
  • När någon av dessa händelser inträffar och SQL Server läser in minnesstrukturerna igen finns det ingen post om att en ordlista D1 och dess interna ID fanns. Det beror på att ordlistan D1 inte fanns kvar i systemtabellerna när Transact-SQL-instruktionen avslutades eller avslutades.

  • Om bakgrundsaktiviteten för tuppelflyttaren startar nu uppstår inga fel eftersom de villkor som beskrivs i steg 3 gäller.

  • Om en ny radgrupp R3 skapas innan bakgrundsaktiviteten för tuppelflyttaren startar (enligt föregående punktobjekt) tilldelar SQL Server samma interna ID till den nya ordlistan D1 och refererar ordlista D1 för segment S3 i radgrupp R3.

  • När bakgrundsaktiviteten för att flytta tuppeln startar efter föregående åtgärd släpper den osynliga radgruppen R1 och dess segment S1 tillsammans med den nya ordlistan D1. Detta inträffar eftersom flyttfirman anser att den nya ordlistan D1 och den ursprungliga ordlistan D1 som S1 refererar till är densamma.

    Obs! När det här tillståndet inträffar kan du inte fråga innehållet i radgrupp R3.

Lösning

Problemet åtgärdades först i följande kumulativa uppdateringar för SQL Server:

Kumulativ uppdatering 1 för SQL Server 2014 SP1
        
         Kumulativ uppdatering 8 för SQL Server 2014
Korrigeringen för det här problemet ingår också i följande GDR-uppdateringar (General Distribution Release):

Säkerhetsuppdatering för SQL Server 2014 QFE  
Den här uppdateringen innehåller kumulativ uppdatering 8, den här viktiga korrigeringen och de nödvändiga säkerhetsuppdateringarna MS15-058.

Säkerhetsuppdatering för SQL Server 2014 GDR  
Den här uppdateringen innehåller den här viktiga korrigeringen och kumulativa säkerhetskorrigeringar till och med MS15-058.

Icke-säkerhetsrelaterad uppdatering för SQL Server 2014 Service Pack 1 GDR  
Den här uppdateringen innehåller endast den här viktiga korrigeringen.

Om kumulativa uppdateringar för SQL Server

Varje ny kumulativ uppdatering för SQL Server innehåller alla snabbkorrigeringar och alla säkerhetskorrigeringar som ingick i den tidigare kumulativa uppdateringen. Se de senaste kumulativa uppdateringarna för SQL Server:

      

Mer information

Felmeddelanden Om du kör DBCC CHECKDB efter att du har installerat den här korrigeringen i en databas som för närvarande påverkas får du följande felmeddelande:

Obs

Msg 5289, nivå 16, status 1, rad 1
Grupperat columnstore-index cci i tabell t har ett eller flera datavärden som inte matchar datavärden i en ordlista. Återställ data från en säkerhetskopia.

När du kör en fråga som söker igenom de påverkade tabellerna efter att du har installerat den här korrigeringen i en databas som för närvarande är påverkad, får du följande felmeddelande:

Obs

Msg 5288, nivå 16, status 1, rad 1
Columnstore-indexet har ett eller flera datavärden som inte matchar datavärden i en ordlista. Kör DBCC CHECKDB för mer information.

Om du får dessa fel kan du spara oskadade data genom att massexportera data för opåverkade kolumner/radgrupper och sedan läsa in data igen när du släpper eller skapar det grupperade columnstore-indexet. Du bör aktivera Spårningsflagga 10207 för att utelämna 5288-felet och återgå till det gamla beteendet att hoppa över skadade radgrupper.

Anteckning Felmeddelandena 5288 och 5289 genereras för denna radgrupp R3 som har segment S3. Spårningsflagga 10207 används för att extrahera segmenten i radgrupp R3 som inte påverkas av den saknade ordlistan D1.

Fråga efter berörda databaserFör att avgöra om databasen som innehåller columnstore-index redan påverkas av det här problemet kör du följande fråga:

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 

Anteckningar

  • Du måste köra den här frågan mot varje databas som innehåller columnstore-index på servern som kör SQL Server. En tom resultatuppsättning visar att databasen inte påverkas.

  • Kör den här frågan under en period då det inte finns någon aktivitet som skapar nya radgrupper eller ändrar tillståndet för befintliga radgrupper. Följande aktiviteter kan till exempel ändra tillståndet för radgrupper: indexbygge, omorganiserar index, massinfogning, tuppelflyttare som komprimerar deltalager.

    Innan du kör frågan kan du inaktivera bakgrundsåtgärden för att flytta paret med hjälp av spårningsflaggan 634. Använd det här kommandot för att inaktivera bakgrundsaktiviteten: DBCC TRACEON ( 634 , -1 ). När frågan har körts klart ska du komma ihåg att återaktivera bakgrundsaktiviteten med kommandot: DBCC TRACEOFF ( 634 , -1 ).

    Kontrollera också att det inte finns några BULK INSERT/BCP/SELECT-INTO-kommandon som infogar data i tabellerna som använder columnstore-index medan den här frågan körs.

    Vi rekommenderar att du använder de här stegen för att förhindra att frågan returnerar falska positiva identifieringar.

Status

Microsoft har bekräftat att detta är ett problem i de Microsoft-produkter som anges i avsnittet "Gäller".