KB3067257-FIX: gedeeltelijke resultaten in een query van een gegroepeerde column column in SQL Server 2014

In dit artikel wordt beschreven wat er gebeurt wanneer u een query uitvoert van een gegroepeerde column column in Microsoft SQL Server 2014. Dit artikel biedt een oplossing voor dit probleem.

Samenvatting

Wanneer u een query gebruikt waarmee een geclusterde column base-index wordt gescand in Microsoft SQL Server 2014, kunt u onder zeldzame voorwaarden gedeeltelijke queryresultaten ontvangen. Dit probleem treedt op wanneer de volgende bewerking wordt uitgevoerd.

Stap 1

Met een Transact-SQL-instructie [invoegen of BULKSGEWIJS invoegen] voegt u gegevens toe aan een tabel met een gegroepeerde column column van de index. Tijdens deze bewerking zijn de volgende voorwaarden van toepassing:

  • Wanneer de Transact-SQL-instructie de rowgroup-drempel bereikt, wordt rowgroup R1 met segment S1 gesloten.

  • Segment S1 verwijst naar lokale woordenlijst D1.

  • De instructie gaat verder om rijen in te voegen in de nieuwe rowgroup R2.

  • Wanneer u rowgroup R1 sluit, moet u het lokale woordenboek D1 ook niet sluiten. Als er nog steeds ruimte beschikbaar is in de woordenlijst, kunt u deze open en opnieuw gebruiken voor de nieuwe rowgroup R2.

Stap 2

Als de Transact-SQL-instructie abnormaal wordt beëindigd of geannuleerd voordat deze de nieuwe rowgroup R2 sluit, zijn de volgende voorwaarden van toepassing:

  • Wijzigingen in de metagegevens van een Data Store worden in subtrans acties vastgelegd en apart van de buitenste transactie vastgelegd.

  • Op dit moment wordt rowgroup R1 in de systeemtabel bewaard in de tabel ' onder bouw ' of onzichtbare status, en segment S1 verwijst naar een Dictionary van het segment D1.

  • Er is geen rij gemaakt in de systeemtabel voor de Dictionary D1. Dit komt doordat de Transact-SQL-instructie nooit de mogelijkheid heeft om de bestaande rij te sluiten. Daarom blijft de bestaande rij behouden.

Stap 3

Wanneer de achtergrondtaak voor de tupleset na de einde van de Transact-SQL-instructie in de normale situatie begint, verwijdert de achtergrondtaak de onzichtbare rowgroup R1 en het segment S1. Als er nu een nieuwe Transact-SQL-instructie wordt gestart en het maken van rowgroup R3 voor een nieuw segment S3 is waarvoor een nieuwe lokale woordenlijst is vereist, kunt u de interne ID van de woordenlijst niet opnieuw gebruiken. Dit komt doordat de in-Geheugenstatus van de columnstore de gebruikte Dictionary-Id's bijhouden. Door segment S3 wordt daarom verwezen naar nieuwe woordenlijsten D2.Opmerking Deze stap is een veelvoorkomende voorwaarde. Dit kan dus geen beschadiging voordoen.

Stap 4

Als de status in het geheugen van de werkruimte in SQL Server verloren gaat voordat de taak van de tupel-verplaatsingstaak van kracht is (en de procedure wordt uitgevoerd in stap 3), vindt u het probleem dat in dit artikel wordt beschreven.Opmerkingen

  • Deze gebeurtenis vindt plaats om de volgende redenen:

    • SQL Server ervaart geheugen overoverload en de inhoud in het geheugen van de Dictionary D1 wordt uit het geheugen verwijderd.

    • Het exemplaar van SQL Server wordt opnieuw gestart.

    • De database met de geclusterde column column-index gaat offline en komt vervolgens weer online.

  • Nadat een van deze gebeurtenissen zich voordoet en SQL Server de structuur in het geheugen laadt, wordt er geen record gemaakt waarmee een woordenlijst D1 en de interne ID bestaan. Dit komt doordat Dictionary D1 niet bewaard werd in de systeemtabellen wanneer de Transact-SQL-instructie werd beëindigd of conceled.

  • Als de achtergrondtaak voor de tupel-verdrijfing op dit moment begint, treden er geen fouten op omdat de voorwaarden die in stap 3 worden beschreven.

  • Als een nieuwe rowgroup R3 wordt gemaakt voordat de achtergrondtaak van de tupel-overschakeling wordt gestart (volgens het vorige opsommings item), wijst SQL Server dezelfde interne ID toe aan de nieuwe woordenlijst D1 en wordt in rowgroup R3 de woordenlijst D1 voor het segment S3 weergeven.

  • Wanneer de achtergrondtaak voor de tupleset begint na de vorige actie, wordt deze onzichtbaar gemaakt in rowgroup R1 en de segmenten van de nieuwe woordenlijst D1. Dit gebeurt omdat de tupel-verplaatsings dienst voor de nieuwe woordenlijst D1 en de oorspronkelijke woordenlijst verloren gaat, en dat geldt ook voor S1.Opmerking Wanneer deze voorwaarde zich voordoet, kunt u de inhoud van rowgroup R3 niet opvragen.

Oplossing

Het probleem is voor het eerst opgelost in de volgende cumulatieve updates voor SQL Server:

Cumulatieve update 1 voor SQL server 2014 SP1 cumulatief update 8 voor SQL Server 2014De oplossing voor dit probleem is ook opgenomen in de volgende updates voor GDR (General Distribution Release):

Beveiligings update voor SQL Server 2014 QFE  Deze update bevat cumulatieve update 8, deze belangrijke oplossing en de vereiste MS15-058-beveiligingsupdates.Beveiligings update voor SQL Server 2014 GDR  Deze update bevat deze belangrijke oplossingen voor correcties en cumulatieve beveiligingsfixes via MS15-058.Niet-beveiligings update voor SQL Server 2014 Service Pack 1 GDR  Deze update bevat alleen deze belangrijke oplossing.

Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingsoplossingen die zijn opgenomen in de vorige cumulatieve update. Zie de nieuwste cumulatieve updates voor SQL Server:

Meer informatie

FoutberichtenAls u in een database die momenteel is veranderd, DBCC CHECKDB uitvoert nadat u deze oplossing hebt toegepast, wordt het volgende foutbericht weergegeven:

Bericht 5289, niveau 16, status 1, lijn 1 gegroepeerde column van de column column ' in tabel ' heeft een of meer gegevenswaarden die niet overeenkomen met gegevenswaarden in een woordenlijst. Herstel de gegevens van een back-up.

Wanneer u in een database die op dat moment is beïnvloed, een query uitvoert waarmee de betrokken tabellen worden gescand nadat u deze oplossing hebt toegepast, wordt het volgende foutbericht weergegeven:

Msg 5288, niveau 16, status 1, line 1, Columnstore-index heeft een of meer gegevenswaarden die niet overeenkomen met gegevenswaarden in een woordenlijst. Voer DBCC CHECKDB uit voor meer informatie.

Als dit foutbericht wordt weergegeven, kunt u de niet-beschadigde gegevens opslaan door bulksgewijs de gegevens van ongewijzigde kolommen/rowgroups te exporteren en de gegevens vervolgens opnieuw te laden nadat u de gegroepeerde column column hebt verwijderd of gemaakt. U dient traceringsvlag 10207 in te schakelen om de 5288-fout te onderdrukken en terug te keren naar het oude gedrag van het overslaan van beschadigde rowgroups. Opmerking Foutberichten 5288 en 5289 worden gegenereerd voor deze rowgroup R3 met segment S3. Traceringsvlag 10207 wordt gebruikt om de segmenten van rowgroup R3 te extraheren die niet worden beïnvloed door de ontbrekende Dictionary D1.

Query voor beïnvloede databasesVoer de volgende query uit om te controleren of de database met column columns-indexen al door dit probleem is getroffen:

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

  • Voer deze query uit voor elke database met column columns-indexen op de server waarop SQL Server wordt uitgevoerd. Een lege resultatenreeks geeft aan dat de database niet is beïnvloed.

  • Voer deze query uit gedurende een periode waarin er geen activiteiten zijn die nieuwe rowgroups maken of de status van bestaande rowgroups wijzigen. Met de volgende activiteiten kunnen de status van rowgroups: index build, het opnieuw organiseren van indexen, bulksgewijs invoegen, voor het comprimeren van Delta winkels worden gecomprimeerd. Voordat u de query uitvoert, kunt u de aandrijf taak op de achtergrond uitschakelen met behulp van de traceringsvlag 634. Gebruik deze opdracht om de achtergrondtaak uit te schakelen: DBCC TRACEON (634,-1). Vergeet niet de achtergrondtaak opnieuw in te schakelen met behulp van de opdracht: DBCC TRACEOFF (634,-1)wanneer de query wordt uitgevoerd. Zorg er ook voor dat er geen BULKSGEWIJZE INVOEG-en BCP-en SELECT-opdrachten voor het invoegen van gegevens zijn toegevoegd aan de tabellen die gebruikmaken van de index van de column column tijdens het uitvoeren van deze query. U wordt aangeraden deze stappen te volgen om te voorkomen dat de query onwaar retourneert.

Status

Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×