FIX: Gedeeltelijke resultaten in een query van een index van de gegroepeerde columnstore in SQL Server-2014

BELANGRIJK: Dit artikel is vertaald door middel van automatische vertalingssoftware van Microsoft en is mogelijk nabewerkt door de Microsoft Community via CTF-technologie (Community Translation Framework) of door een menselijke vertaler. Microsoft biedt zowel automatisch vertaalde, door mensen vertaalde en door de community nabewerkte artikelen aan, zodat er in meerdere talen toegang is tot alle artikelen in onze Knowledge Base. Een vertaald of bewerkt artikel kan fouten bevatten in vocabulaire, syntaxis of grammatica.. Microsoft is niet verantwoordelijk voor eventuele onjuistheden, fouten of schade ten gevolge van een foute vertaling van de inhoud van een bericht of het gebruik van deze vertaalde berichten door onze klanten.

De Engelstalige versie van dit artikel is de volgende: 3067257
Dit artikel wordt een probleem dat tijdens een query van een geclusterde columnstore index in Microsoft SQL Server-2014 optreedt. Dit artikel bevat een resolutie voor dit probleem.
Samenvatting
Wanneer u een query die een columnstore geclusterde index in Microsoft SQL Server-2014 scant, kunt u in zeldzame gevallen ontvangen gedeeltelijke queryresultaten.

Dit probleem treedt op wanneer de volgende bewerking wordt uitgevoerd.
Stap 1
[INSERT of BULK INSERT] een Transact-SQL-instructie voegt de gegevens in een tabel met columnstore-index is gegroepeerd. Tijdens deze bewerking gelden de volgende voorwaarden:
  • Wanneer de rowgroup-drempel wordt bereikt door de Transact-SQL-instructie, die wordt rowgroup R1 dat segment S1 heeft gesloten.
  • Segment S1 verwijst naar lokale woordenlijst D1.
  • De instructie nog steeds nieuwe rowgroup R2 rijen invoegen.
  • Rowgroup R1 is gesloten, hoeft de lokale woordenlijst D1 ook niet te worden gesloten. Als woordenlijst D1 nog beschikbare ruimte bevat, kunt u open te laten en opnieuw gebruiken voor het nieuwe rowgroup R2.
Stap 2
Als de Transact-SQL-instructie is abnormaal wordt beëindigd of geannuleerd voordat de nieuwe rowgroup R2 gesloten, gelden de volgende voorwaarden:
  • Columnstore metagegevens wijzigingen optreden in er onderliggende transacties die onafhankelijk van de buitenste transactie doorvoeren.
  • Rowgroup die R1 blijft bestaan in de systeemtabel in een "in aanbouw" of onzichtbaar en segment S1 verwijst nu naar woordenlijst D1.
  • Er is geen rij in de systeemtabel voor D1 woordenlijst gemaakt. Dit komt doordat de Transact-SQL-instructie is nooit een verkoopkans af te sluiten van de bestaande rij. Daarom blijft de bestaande rij bestaan.
Stap 3
In een normale situatie, als de tupel mover achtergrondtaak wordt gestart na afloop van de Transact-SQL-instructie taak op de achtergrond de onzichtbare rowgroup R1 en het segment S1 verwijderd. Als u Transact-SQL-instructie wordt nu gestart en rowgroup R3 met een nieuw segment S3 waarvoor een nieuwe lokale woordenlijst maakt, kunt u de interne ID van woordenlijst D1 niet opnieuw gebruiken. Dit is omdat de staat in het geheugen van de columnstore houdt van de woordenlijst-id's die worden gebruikt. Segment S3 verwijst dus naar nieuwe woordenlijst D2.

Opmerking De voorwaarde in deze stap is een algemene voorwaarde. Daarom optreedt geen beschadiging.
Stap 4
Als SQL Server, verliest de staat in het geheugen van de woordenlijst D1 voordat de tupel mover taak van kracht (wordt uitgevoerd zoals beschreven in stap 3), wordt het probleem dat in dit artikel wordt beschreven optreedt.

Opmerkingen
  • Deze gebeurtenis treedt op voor een van de volgende oorzaken hebben:
    • SQL Server ervaringen overbelasting van geheugen en de inhoud in het geheugen van de woordenlijst D1 zijn verwijderd uit het geheugen.
    • Het exemplaar van SQL Server opnieuw wordt gestart.
    • De database met de columnstore van geclusterde index off line gaat en vervolgens weer on line komt.
  • Na een van deze gebeurtenissen optreden en SQL Server de structuren in het geheugen geladen, er is geen record die een woordenboek D1 en de interne ID bestond. Dit komt omdat de woordenlijst D1 is niet opgeslagen in de systeemtabellen wanneer de Transact-SQL-instructie is beëindigd of conceled.
  • Als de tupel mover achtergrondtaak op dit moment wordt gestart, wordt er geen fouten optreden omdat de voorwaarden die zijn beschreven in stap 3 van toepassing.
  • Als een nieuwe rowgroup R3 is gemaakt voordat de tupel mover achtergrondtaak (per de vorige item opsommingsteken start), SQL Server dezelfde interne ID toegewezen aan de nieuwe woordenlijst D1 en D1 woordenlijst voor segment S3 in rowgroup R3 verwijst.
  • Wanneer de tupel mover achtergrondtaak wordt gestart na de vorige actie, daalt het onzichtbare rowgroup R1 en haar segmenten S1 samen met de nieuwe woordenlijst D1. Dit gebeurt omdat de Verhuiswagen tupel van oordeel is dat nieuwe woordenlijst D1 en de oorspronkelijke woordenlijst D1 S1 verwijzingen zijn hetzelfde.

    Opmerking Wanneer deze toestand optreedt, kunt u de inhoud van de rowgroup R3 niet opvragen.
Oplossing
Het probleem is in eerste instantie opgelost in de volgende cumulatieve updates voor SQL Server:


De correctie voor dit probleem is ook opgenomen in de volgende updates voor algemene distributie release (GDR):

Beveiligingsupdate voor SQL Server 2014 QFE
Deze update bevat de cumulatieve Update 8, deze belangrijke correctie en de vereiste beveiligingsupdates van MS15-058.

Beveiligingsupdate voor SQL Server 2014 GDR
Deze update bevat deze belangrijke correctie en cumulatieve beveiligingscorrecties via MS15-058.

Update voor SQL Server 2014 Service Pack 1 GDR anders dan voor beveiliging
Deze update bevat alleen deze belangrijke correctie.

Over cumulatieve updates voor SQL Server

Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingscorrecties die zijn opgenomen in de vorige cumulatieve update. Raadpleeg de meest recente cumulatieve updates voor SQL Server:
Meer informatie

Foutberichten

In een database op dat moment waarin dit probleem optreedt als u DBCC CHECKDB uitvoeren nadat u deze correctie hebt toegepast wordt volgende foutbericht weergegeven:
Msg 5289, 16, staat 1, regel 1 niveau
Columnstore geclusterde index 'cci' in tabel 't' heeft een of meer waarden die niet overeenkomen met de gegevenswaarden in een woordenboek. De gegevens terugzetten vanaf een back-up.

In een database op dat moment waarin dit probleem optreedt bij het uitvoeren van een query waarmee de betrokken tabellen worden gescand nadat u deze correctie hebt toegepast wordt het volgende foutbericht weergegeven:
Msg 5288, 16, staat 1, regel 1 niveau
Index van Columnstore heeft een of meer waarden die niet overeenkomen met de gegevenswaarden in een woordenboek. Voer DBCC CHECKDB voor meer informatie.

Als u deze fouten ontvangt, kunt u de gegevens niet is beschadigd door bulk exporteren van de gegevens van ongemoeid kolommen/rowgroups en vervolgens de gegevens opnieuw laden nadat u neerzetten of maak columnstore geclusterde index kunt opslaan. Schakel traceringsvlag 10207 de fout 5288 onderdrukken en wilt teruggaan naar het oude gedrag van het overslaan van beschadigde rowgroups.

Opmerking Foutberichten, 5288 en 5289 worden gegenereerd voor deze rowgroup R3 met S3 segment. Traceringsvlag 10207 wordt gebruikt voor het uitpakken van de segmenten van de rowgroup R3 die niet worden beïnvloed door de ontbrekende woordenlijst D1.

Query voor databases waarin dit probleem optreedt

Om te bepalen of de database met columnstore indexen al met dit probleem kampt, kunt u de volgende query uitvoeren:
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 

Opmerkingen
  • U moet deze query uitgevoerd voor elke database met columnstore indexen op de server waarop SQL Server wordt uitgevoerd. Een lege resultaatset geeft aan dat de database niet wordt beïnvloed.
  • Uitvoeren van deze query een periode als er geen activiteit die nieuwe rowgroups maken of wijzigen van de status van bestaande rowgroups. Bijvoorbeeld de status van rowgroups kunnen wijzigen in de volgende activiteiten: index maken, index reorganiseren, bulk insert, tupel mover delta winkels te comprimeren.

    Voordat u de query uitvoert kunt u de achtergrond tupel mover taak uitschakelen met behulp van de traceringsvlag 634. Gebruik deze opdracht om een taak op de achtergrond uitschakelen: DBCC TRACEON (634, -1). Nadat de query uitgevoerd is, moet u de achtergrondtaak opnieuw in te schakelen met behulp van de opdracht: DBCC TRACEOFF (634, -1).

    Controleer ook of er worden geen BULK INSERT/BCP/SELECT-naar-opdrachten invoegen van gegevens in de tabellen die columnstore index gebruiken terwijl deze query wordt uitgevoerd.

    Het verdient aanbeveling om deze procedure om te voorkomen dat de query retourneert false positieven.
Status
Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'.

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 3067257 - Laatst bijgewerkt: 07/23/2015 02:42:00 - Revisie: 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 KbMtnl
Feedback