KB3067257 — Poprawka: częściowe wyniki w kwerendzie dotyczącej klastrowanego indeksu magazynu kolumn w programie SQL Server 2014

W tym artykule omówiono problem występujący podczas wykonywania zapytania dotyczącego indeksu magazynu kolumn klastrowanego w programie Microsoft SQL Server 2014. Ten artykuł zawiera rozwiązanie tego problemu.

Podsumowanie

W przypadku użycia kwerendy, która skanuje klastrowany indeks magazynu kolumn w programie Microsoft SQL Server 2014, w rzadkich warunkach mogą być wyświetlane częściowe wyniki zapytania. Ten problem występuje, gdy jest wykonywana następująca operacja.

Krok 1

Instrukcja języka Transact-SQL [INSERT lub BULK-INSERT] wstawia dane do tabeli zawierającej klastrowany indeks magazynu kolumn. Podczas tej operacji obowiązują następujące warunki:

  • Gdy instrukcja Transact-SQL osiągnie próg rowgroup, zamyka rowgroup R1 z segmentem S1.

  • Segment S1 wskazuje na słownik lokalny D1.

  • Instrukcja kontynuuje Wstawianie wierszy do nowego rowgroup R2.

  • Gdy rowgroup R1 jest zamknięty, słownik lokalny D1 nie musi być również zamknięty. Jeśli słownik D1 nadal zawiera dostępną ilość miejsca, możesz pozostawić go otwarty i użyć go ponownie, aby uzyskać nowy rowgroup R2.

Krok 2

Jeśli instrukcja Transact-SQL kończy się nienormalnie lub została anulowana przed zamknięciem nowego rowgroup R2, obowiązują następujące warunki:

  • Zmiany dotyczące metadanych magazynu kolumn są wykonywane w podtransakcji, które są zatwierdzane niezależnie od zewnętrznej transakcji.

  • W tym momencie rowgroup R1 utrzymuje się w tabeli systemowej w stanie "w trakcie budowy" lub niewidocznym, a segment S1 odwołuje się do słownika z odwołaniami D1.

  • W tabeli systemowej nie ma wiersza utworzonego dla słownika D1. Dzieje się tak dlatego, że instrukcja Transact-SQL nigdy nie ma możliwości zamknięcia istniejącego wiersza. W związku z tym istniejący wiersz będzie nadal występował.

Krok 3

W typowej sytuacji, jeśli zadanie tła obszaru przenoszenia spoiny rozpoczyna się po zakończeniu instrukcji Transact-SQL, zadanie w tle usuwa niewidoczne rowgroup R1 i segment S1. Jeśli nowa instrukcja Transact-SQL jest teraz uruchomiona i zostanie utworzona rowgroup R3 z nowym segmentem S3, który wymaga nowego słownika lokalnego, nie można ponownie użyć wewnętrznego identyfikatora słownika D1. Wynika to z faktu, że stan w pamięci na liście magazynu przechowuje informacje o używanych identyfikatorach słowników. Dlatego segment S3 będzie odwoływać się do nowego słownika D2.Uwaga Warunek w tym kroku jest typowym warunkiem. Nie ma więc żadnego uszkodzenia.

Krok 4

Jeśli program SQL Server utraci stan pamięci słownika D1 przed zastosowaniem zadania przenoszenia spoiny (i wykonuje go zgodnie z opisem w kroku 3), występuje problem opisany w tym artykule.Uwagi

  • To zdarzenie występuje z jednej z następujących przyczyn:

    • Przeciążenie pamięci operacyjnej programu SQL Server, a zawartość w pamięci w słowniku D1 jest wykluczona z pamięci.

    • Wystąpienie programu SQL Server zostanie ponownie uruchomione.

    • Baza danych zawierająca klastrowany indeks magazynu kolumn zostanie przełączona do trybu offline, a następnie ponownie przejdzie do trybu online.

  • Po wystąpieniu dowolnego z tych zdarzeń i program SQL Server ponownie ładuje struktury w pamięci, nie ma żadnych rekordów, że nie istnieje słownik D1 i jego identyfikator wewnętrzny. Dzieje się tak dlatego, że słownik D1 nie był zachowywany w tabelach systemowych, gdy instrukcja Transact-SQL została zakończona lub conceled.

  • Jeśli w tym momencie jest uruchomione zadanie tła obszaru przenoszenia spoiny, nie występują błędy, ponieważ obowiązują warunki opisane w kroku 3.

  • Jeśli nowa rowgroup R3 zostanie utworzona przed rozpoczęciem zadania tła obszaru przenoszenia spoiny (za poprzedni element punktora), program SQL Server przypisze ten sam identyfikator wewnętrzny do nowego słownika D1 i odwołuje się do słownika D1 dla segmentu S3 w rowgroup R3.

  • Po uruchomieniu zadania tła spoiny krotek po poprzedniej akcji jest on niewidoczny rowgroup R1 i jego segmenty S1 razem z nowym słownikiem D1. Dzieje się tak, ponieważ składnik przenoszenia spoiny uważa, że nowy słownik D1 i oryginalny słownik D1 są takie same.Uwaga W przypadku wystąpienia tego warunku nie można badać zawartości rowgroup R3.

Rozwiązanie

Problem został po raz pierwszy rozwiązany w następujących zbiorczych aktualizacjach programu SQL Server:

Zbiorcza aktualizacja 1 dla programu SQL server 2014 z dodatkiem SP1 Skumulowana aktualizacja 8 dla programu SQL Server 2014Poprawka dotycząca tego problemu jest również uwzględniona w następujących aktualizacjach wersji GDR (General Distribution Release):

Aktualizacja zabezpieczeń dla programu SQL Server 2014 QFE  Ta aktualizacja zawiera zbiorczą aktualizację 8, tę ważną poprawkę oraz wymagane aktualizacje zabezpieczeń MS15-058.Aktualizacja zabezpieczeń dla programu SQL Server 2014 GDR  Ta aktualizacja zawiera te ważne poprawki i skumulowane poprawki zabezpieczeń za pośrednictwem MS15-058.Aktualizacja niezabezpieczająca programu SQL Server 2014 z dodatkiem Service Pack 1 GDR  Ta aktualizacja zawiera tylko tę ważną poprawkę.

Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zobacz najnowsze aktualizacje zbiorcze dla programu SQL Server:

Więcej informacji

Komunikaty o błędachJeśli po zastosowaniu tej poprawki zostanie uruchomione polecenie DBCC CHECKDB w aktualnie dotkniętej bazie danych, zostanie wyświetlony następujący komunikat o błędzie:

Msg 5289, poziom 16, stan 1, klastrowany indeks magazynu kolumnowego "WIK" na tabeli t "ma jedną lub więcej wartości danych, które nie pasują do wartości danych w słowniku. Przywracanie danych z kopii zapasowej.

W obecnie dotkniętej bazie danych po uruchomieniu kwerendy skanującej odpowiednie tabele po zastosowaniu tej poprawki zostanie wyświetlony następujący komunikat o błędzie:

Msg 5288, poziom 16, stan 1, indeks magazynu kolumn w wierszu 1 ma co najmniej jedną wartość danych, która nie pasuje do wartości danych w słowniku. Aby uzyskać więcej informacji, uruchom polecenie DBCC CHECKDB.

Jeśli zostaną wyświetlone te błędy, możesz zapisać nieuszkodzone dane, eksportując dane niedotkniętych kolumnami/RowGroups, a następnie ponownie je ładujesz po upuszczeniu lub utworzeniu klastrowanego indeksu magazynu kolumn. Aby pominąć błąd 5288 i przywrócić stare zachowanie dotyczące pomijania uszkodzonego RowGroups, należy włączyć flagę śledzenia 10207. UwagaW przypadku tej rowgroup R3 są generowane komunikaty o błędach 5288 i 5289, które mają segment S3. Flaga śledzenia 10207 służy do wyodrębniania segmentów rowgroup R3, które nie mają wpływu na brakujący słownik D1.

Zapytanie dotyczące baz danych, których dotyczy problemAby sprawdzić, czy ten problem dotyczy bazy danych zawierającej indeksy magazynu kolumn, uruchom następujące zapytanie:

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 

Uwagi

  • Musisz uruchomić to zapytanie na wszystkich bazach danych zawierających indeksy magazynu kolumn na serwerze, na którym jest uruchomiony program SQL Server. Pusty zestaw wyników wskazuje, że nie ma to wpływu na bazę danych.

  • Wykonaj to zapytanie w okresie, w którym nie ma żadnych działań, które spowodują utworzenie nowych RowGroups lub zmianę stanu istniejących RowGroups. Na przykład poniższe czynności mogą zmodyfikować stan RowGroups: Tworzenie indeksu, porządkowanie Reorganizuj, wstawianie zbiorcze, składanie krotek, kompresowanie magazynów różnicowych. Przed wykonaniem zapytania możesz wyłączyć zadanie przenoszenia spoiny w tle przy użyciu flagi śledzenia 634. Użyj tego polecenia, aby wyłączyć zadanie w tle: DBCC TRACEON (634,-1). Po zakończeniu wykonywania kwerendy Pamiętaj, aby ponownie włączyć zadanie w tle przy użyciu polecenia: DBCC TRACEOFF (634,-1). Upewnij się też, że nie ma poleceń Wstaw ZBIORCZo/BCP/wybierz, aby wstawić dane do tabel, które używają indeksu magazynu kolumn, gdy to zapytanie jest uruchomione. Zaleca się wykonanie tych czynności, aby zapobiec zwracaniu fałszywych wyników kwerendy.

Stan

Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".

Potrzebna dalsza pomoc?

Rozwijaj swoje umiejętności
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów firmy Microsoft

Czy te informacje były pomocne?

Dziękujemy za opinię!

Dziękujemy za opinię! Wygląda na to, że połączenie Cię z jednym z naszych agentów pomocy technicznej pakietu Office może być pomocne.

×