Bei Microsoft anmelden
Melden Sie sich an, oder erstellen Sie ein Konto.
Hallo,
Wählen Sie ein anderes Konto aus.
Sie haben mehrere Konten.
Wählen Sie das Konto aus, mit dem Sie sich anmelden möchten.

In diesem Artikel wird ein Problem erläutert, das während einer Abfrage eines gruppierten columnstore-Index in Microsoft SQL Server 2014 auftritt. Dieser Artikel bietet eine Lösung für dieses Problem.

Zusammenfassung

Wenn Sie eine Abfrage verwenden, die einen gruppierten columnstore-Index in Microsoft SQL Server 2014 scannt, können Sie unter seltenen Bedingungen partielle Abfrageergebnisse empfangen. Dieses Problem tritt auf, wenn der folgende Vorgang ausgeführt wird.

Schritt 1

Eine Transact-SQL-Anweisung [INSERT oder BULK-INSERT] fügt Daten in eine Tabelle mit einem gruppierten columnstore-Index ein. Während dieses Vorgangs gelten die folgenden Bedingungen:

  • Wenn die Transact-SQL-Anweisung den rowgroup-Schwellenwert erreicht, wird rowgroup R1 mit dem Segment s1 geschlossen.

  • Segment s1 verweist auf lokales Wörterbuch D1.

  • Die Anweisung fügt weiterhin Zeilen in neue rowgroup R2 ein.

  • Wenn rowgroup R1 geschlossen ist, muss das lokale Wörterbuch D1 nicht ebenfalls geschlossen werden. Wenn Dictionary D1 weiterhin über verfügbaren Speicherplatz verfügt, können Sie es geöffnet lassen und für das neue rowgroup R2 wieder verwenden.

Schritt 2

Wenn die Transact-SQL-Anweisung vorzeitig beendet oder abgebrochen wird, bevor das neue rowgroup R2 geschlossen wird, gelten die folgenden Bedingungen:

  • Änderungen an Columnstore-Metadaten erfolgen in unter Transaktionen, die unabhängig von der äußeren Transaktion committen.

  • An diesem Punkt wird rowgroup R1 in der Systemtabelle in einem "Under Construction"-oder Invisible-Zustand beibehalten, und Segment s1 verweist auf das Wörterbuch D1.

  • In der Systemtabelle für Dictionary D1 wird keine Zeile erstellt. Dies liegt daran, dass die Transact-SQL-Anweisung niemals die Möglichkeit hat, die vorhandene Zeile zu schließen. Daher bleibt die vorhandene Zeile erhalten.

Schritt 3

In einer typischen Situation, wenn die Hintergrundaufgabe des Tupel-Mover nach dem Ende der Transact-SQL-Anweisung gestartet wird, entfernt die Hintergrundaufgabe den unsichtbaren rowgroup R1 und das Segment s1. Wenn jetzt eine neue Transact-SQL-Anweisung gestartet wird und rowgroup R3 mit einem neuen Segment S3 erstellt wird, für das ein neues lokales Wörterbuch erforderlich ist, können Sie die interne ID des Dictionary D1 nicht wieder verwenden. Der Grund dafür ist, dass der speicherresidente Zustand des columnstore die verwendeten Wörterbuch-IDs nachverfolgt. Daher wird Segment S3 auf das neue Dictionary D2 verweisen.Hinweis Die Bedingung in diesem Schritt ist eine allgemeine Bedingung. Daher tritt keine Beschädigung auf.

Schritt 4

Wenn SQL Server den speicherresidenten Zustand des Dictionary D1 verliert, bevor die Tupel-Mover-Aufgabe wirksam wird (und wie in Schritt 3 beschrieben), tritt das in diesem Artikel beschriebene Problem auf.Hinweise

  • Dieses Ereignis tritt aus einem der folgenden Gründe auf:

    • SQL Server erlebt eine Speicherüberlastung, und die speicherresidenten Inhalte des Dictionary D1 werden aus dem Arbeitsspeicher vertrieben.

    • Die Instanz von SQL Server wird neu gestartet.

    • Die Datenbank, die den gruppierten columnstore-Index enthält, wird offline geschaltet und dann wieder online geschaltet.

  • Nachdem eines dieser Ereignisse aufgetreten ist und SQL Server die in-Memory-Strukturen neu lädt, gibt es keinen Eintrag, in dem ein Dictionary D1 und dessen interne ID vorhanden waren. Dies liegt daran, dass Dictionary D1 in den Systemtabellen nicht beibehalten wurde, als die Transact-SQL-Anweisung beendet oder conceled wurde.

  • Wenn die Hintergrundaufgabe des Tupel-Mover zu diesem Zeitpunkt beginnt, treten keine Fehler auf, da die in Schritt 3 beschriebenen Bedingungen zutreffen.

  • Wenn ein neuer rowgroup R3 erstellt wird, bevor die Hintergrundaufgabe des Tupel-Mover (pro Vorheriges Aufzählungselement) gestartet wird, weist SQL Server dem neuen Wörterbuch D1 dieselbe interne ID zu, und es verweist auf Dictionary D1 für Segment S3 in rowgroup R3.

  • Wenn die Hintergrundaufgabe des Tupel-Mover nach der vorherigen Aktion beginnt, werden die unsichtbaren rowgroup R1 und ihre Segmente S1 zusammen mit dem neuen Wörterbuch D1 gelöscht. Dies tritt auf, weil der Tupel-Mover der Ansicht ist, dass das neue Dictionary D1 und das ursprüngliche Dictionary D1 die gleichen sind.Hinweis Wenn diese Bedingung eintritt, können Sie den Inhalt von rowgroup R3 nicht Abfragen.

Lösung

Das Problem wurde zunächst in den folgenden kumulativen Updates für SQL Server behoben:

Kumulatives Update 1 für SQL Server 2014 SP1 Kumulatives Update 8 für SQL Server 2014Die Fehlerbehebung für dieses Problem ist auch in den folgenden Updates der allgemeinen Distributionsversion (GDR) enthalten:

Sicherheits Update für SQL Server 2014 QFE  Dieses Update umfasst das kumulative Update 8, diesen wichtigen Fix und die erforderlichen MS15-058-Sicherheitsupdates.Sicherheits Update für SQL Server 2014 GDR  Dieses Update umfasst diese wichtigen Fix-und kumulativen Sicherheitsfixes über MS15-058.Nonsecurity-Update für SQL Server 2014 Service Pack 1 GDR  Dieses Update enthält nur diese wichtige Lösung.

Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und alle Sicherheitsupdates, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:

Weitere Informationen

FehlermeldungenWenn Sie in einer aktuell betroffenen Datenbank DBCC CHECKDB ausführen, nachdem Sie diesen Fix angewendet haben, wird die folgende Fehlermeldung angezeigt:

Msg 5289, Ebene 16, Zustand 1, Zeile 1 gruppierter columnstore-Index "CCI" in der Tabelle "t" verfügt über einen oder mehrere Datenwerte, die nicht den Datenwerten in einem Wörterbuch entsprechen. Wiederherstellen der Daten aus einer Sicherung

Wenn Sie in einer aktuell betroffenen Datenbank eine Abfrage ausführen, die die betroffenen Tabellen scannt, nachdem Sie diesen Fix angewendet haben, wird die folgende Fehlermeldung angezeigt:

Msg 5288, Ebene 16, Status 1, Zeile 1 Columnstore-Index weist einen oder mehrere Datenwerte auf, die nicht mit den Datenwerten in einem Wörterbuch übereinstimmen. Führen Sie DBCC CHECKDB aus, um weitere Informationen zu erhalten.

Wenn diese Fehlermeldung angezeigt wird, können Sie die unbeschädigten Daten speichern, indem Sie die Daten von unbeeinflussten Spalten/RowGroups Massenexportieren und dann die Daten nach dem Löschen oder Erstellen des gruppierten columnstore-Index erneut laden. Sie sollten das Ablaufverfolgungsflag 10207 aktivieren, um den 5288-Fehler zu unterdrücken und das alte Verhalten des Überspringens fehlerhafter RowGroups wiederherzustellen. HinweisFür diesen rowgroup R3 mit dem Segment S3 werden Fehlermeldungen 5288 und 5289 generiert. Das Ablaufverfolgungsflag 10207 wird verwendet, um die Segmente von rowgroup R3 zu extrahieren, die nicht vom fehlenden Wörterbuch D1 betroffen sind.

Abfrage für betroffene DatenbankenFühren Sie die folgende Abfrage aus, um zu ermitteln, ob die Datenbank, die columnstore-Indizes enthält, bereits von diesem Problem betroffen ist:

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 

Hinweise

  • Sie müssen diese Abfrage für jede Datenbank ausführen, die columnstore-Indizes auf dem Server enthält, auf dem SQL Server ausgeführt wird. Eine leere Ergebnismenge gibt an, dass die Datenbank nicht betroffen ist.

  • Führen Sie diese Abfrage während eines Zeitraums aus, wenn keine Aktivität vorhanden ist, die neue RowGroups erstellen oder den Zustand vorhandener RowGroups ändern soll. Die folgenden Aktivitäten können beispielsweise den Zustand von RowGroups ändern: Indexerstellung, Index Neuorganisieren, Masseneinfügung, Tupel-Mover-Komprimierungs Delta Speicher. Bevor Sie die Abfrage ausführen, können Sie die Hintergrund-Tupel-Mover-Aufgabe mithilfe des Ablaufverfolgungsflags 634 deaktivieren. Verwenden Sie diesen Befehl, um die Hintergrundaufgabe zu deaktivieren: DBCC TRACEON (634,-1). Nachdem die Ausführung der Abfrage beendet wurde, denken Sie daran, die Hintergrundaufgabe mithilfe des Befehls: DBCC TRACEOFF (634,-1)wieder zu aktivieren. Stellen Sie außerdem sicher, dass es keine Masseneinfügung/bcp/SELECT-in-Befehle gibt, die Daten in die Tabellen einfügen, die columnstore-Index verwenden, während diese Abfrage ausgeführt wird. Es wird empfohlen, diese Schritte zu verwenden, um zu verhindern, dass die Abfrage falsch-positive Werte zurückgibt.

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.

In den Communities können Sie Fragen stellen und beantworten, Feedback geben und von Experten mit umfassendem Wissen hören.

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Sprachqualität?
Was hat Ihre Erfahrung beeinflusst?
Wenn Sie auf "Absenden" klicken, wird Ihr Feedback zur Verbesserung von Produkten und Diensten von Microsoft verwendet. Ihr IT-Administrator kann diese Daten sammeln. Datenschutzbestimmungen.

Vielen Dank für Ihr Feedback!

×