Jesteś obecnie w trybie offline. Czekamy na ponowne połączenie z Internetem.

Poprawka: Wyniki częściowe w kwerendzie indeksu klastrowanego magazynu kolumn w 2014 serwera SQL

WAŻNE: Ten artykuł został przetłumaczony przy użyciu oprogramowania firmy Microsoft do tłumaczenia maszynowego i może być poprawiony przy użyciu technologii Community Translation Framework (CTF). Firma Microsoft udostępnia artykuły tłumaczone maszynowo, poprawione przez społeczność, a także tłumaczone przez tłumaczy profesjonalnych, aby zapewnić dostęp do wszystkich artykułów w bazie wiedzy w wielu językach. Artykuły tłumaczone maszynowo i poprawione mogą zawierać błędy pisowni, składniowe i gramatyczne. Firma Microsoft nie ponosi odpowiedzialności za żadne nieścisłości, błędy ani szkody spowodowane przez niepoprawne tłumaczenia zawartości ani przez korzystanie z niej przez klientów. Więcej o strukturze CTF: http://support.microsoft.com/gp/machine-translation-corrections/pl.

Anglojęzyczna wersja tego artykułu to: 3067257
W tym artykule omówiono problem, który występuje podczas wykonywania kwerendy indeksu klastrowanego magazynu kolumn w 2014 r. Microsoft SQL Server. W tym artykule przedstawiono rozdzielczość Aby ten problem.
Streszczenie
Kiedy należy użyć kwerendy, która służy do skanowania indeksu klastrowanego magazynu kolumn w 2014 r. Microsoft SQL Server, może w warunkach rzadkich, otrzymujesz wyniki częściowe kwerendy.

Ten problem występuje po uruchomieniu następujących operacji.
Krok 1
Instrukcja języka Transact-SQL [INSERT lub instrukcja BULK INSERT] wstawia dane do tabeli, która ma magazynu kolumn indeks klastrowany. Podczas tej operacji stosuje się następujące warunki:
  • Instrukcja języka Transact-SQL osiągnie próg rowgroup, powoduje zamknięcie rowgroup R1, który składa się z segmentu S1.
  • S1 segmentu punktów do lokalnego słownika D1.
  • Wstawianie wierszy do nowych rowgroup R2 w dalszym ciągu instrukcja.
  • Po zamknięciu rowgroup R1 lokalnego słownika D1 również nie ma być zamknięty. Jeśli słownik D1 ma nadal dostępnego miejsca, można pozostawić otwarte i go ponownie użyć dla nowego rowgroup R2.
Krok 2
Jeśli instrukcja języka Transact-SQL jest zakończona w sposób niestandardowy lub anulowana przed jej zamknięciem nowej rowgroup R2, stosuje się następujące warunki:
  • Zmiany metadanych magazynu kolumn występują w subtransactions, które zobowiążą się niezależnie od transakcji zewnętrznych.
  • W tym momencie rowgroup, który R1 utrzymuje się w tabeli systemowej "w przygotowaniu" lub niewidoczne Państwo oraz segmentu S1 odwołuje się do słownika D1.
  • Istnieje bez wiersza utworzone w tabeli systemowej dla słownika D1. Dlatego instrukcja języka Transact-SQL nigdy nie ma szansę zamknąć istniejącego wiersza. W związku z tym utrzymuje się istniejącego wiersza.
Krok 3
W typowej sytuacji, jeśli zadania w tle mover krotki rozpoczyna się po zakończeniu instrukcji języka Transact-SQL, niewidocznych rowgroup R1 i segmentu S1 powoduje usunięcie zadania w tle. Jeśli nowy instrukcji języka Transact-SQL jest rozpoczęta teraz i tworzy rowgroup R3, który ma nowy segment S3, wymagającego nowego słownika lokalnego, nie można ponownie użyć wewnętrzny identyfikator tego słownika D1. Jest to spowodowane w pamięci stan magazynu kolumn przechowuje informacje o słowniku identyfikatorów, które są używane. W związku z tym segment S3 będzie odwoływać się do nowego słownika D2.

Uwaga: Warunek w tym kroku jest wspólnym stan. W związku z tym nie uszkodzenie.
Krok 4
Jeśli program SQL Server traci stan w pamięci słownika D1, zanim zadanie przenoszenia krotki staje się skuteczne (i wykonuje zgodnie z opisem w kroku 3), występuje problem opisany w tym artykule.

Uwagi
  • Zdarzenie to zachodzi jedna z następujących przyczyn:
    • SQL Server doświadczeń przeciążenie pamięci i zawartość w pamięci słownik D1 są eksmitowany z pamięci.
    • Wystąpienie programu SQL Server jest uruchamiany ponownie.
    • Baza danych zawierająca indeksu klastrowanego magazynu kolumn przejdzie do trybu offline, a potem przychodzi powrotu do trybu online.
  • Po jednym z tych wydarzeń występują i SQL Server ładuje struktur w pamięci, nie ma żadnego rekordu który słownik D1 i jego wewnętrznego istniały identyfikator. Jest to spowodowane słownik D1 nie został zachowany w tabelach systemowych po instrukcji języka Transact-SQL została zakończona lub conceled.
  • Jeśli w tym momencie rozpoczyna się zadania w tle mover spoiny, nie pojawiają się błędy, ponieważ stosuje się warunki opisane w kroku 3.
  • Jeśli nowy rowgroup R3 jest tworzony przed uruchomieniem zadania krotki mover tła (na Poprzednia pozycja punktora), SQL Server przypisuje ten sam identyfikator wewnętrzny nowy słownik D1 i odwołuje się ono do słownika D1 dla segmentu S3 w rowgroup R3.
  • Po uruchomieniu zadania w tle krotki mover po poprzedniej akcji krople rowgroup niewidoczne R1 i jej segmenty S1 wraz z nowego słownika D1. Dzieje się tak, ponieważ mover krotki uważa, że nowy słownik D1 i oryginalny słownik D1 S1 odwołania są takie same.

    Uwaga: W przypadku wystąpienia tego warunku nie można zbadać zawartość rowgroup R3.
Rozwiązanie
Problem został rozwiązany po raz pierwszy w następujących aktualizacji zbiorczej dla programu SQL Server:


Poprawkę dotyczącą tego problemu znajduje się również w następujących aktualizacjach poprawek GDR dystrybucji ogólnej:

Aktualizacja zabezpieczeń dla programu SQL Server 2014 QFE
Ta aktualizacja zbiorcza aktualizacja 8, ta poprawka ważne i wymaganych aktualizacji zabezpieczeń MS15-058.

Aktualizacja zabezpieczeń dla programu SQL Server 2014 GDR
Ta aktualizacja obejmuje ta poprawka ważne i skumulowane poprawki zabezpieczeń za pośrednictwem MS15-058.

Niezwiązanej z zabezpieczeniami aktualizacji dla programu SQL Server 2014 z dodatkiem Service Pack 1 GDR
Ta aktualizacja obejmuje to istotne poprawki.

Aktualizacje zbiorcze dla programu SQL Server — informacje

Każdej nowej aktualizacji zbiorczej dla programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały zawarte w poprzedniej zbiorczej aktualizacji. Zobacz najnowsze aktualizacje zbiorcze dla programu SQL Server:
Więcej informacji

Komunikaty o błędach

W obecnie odnośna baza danych jeśli zostanie uruchomione polecenie DBCC CHECKDB, po zastosowaniu tej poprawki, pojawia się następujący komunikat o błędzie:
Msg 5289, poziom: 16, stan: 1, wiersz 1
Indeks klastrowanego magazynu kolumn "WIK" na tabeli 't' ma jedną lub więcej wartości danych, które nie odpowiadają wartości danych w słowniku. Przywrócić dane z kopii zapasowej.

W obecnie odnośna baza danych po uruchomieniu kwerendy, która służy do skanowania tabele, po zastosowaniu tej poprawki, pojawi się następujący komunikat o błędzie:
Msg 5288, poziom: 16, stan: 1, wiersz 1
Indeks Columnstore ma jedną lub więcej wartości danych, które nie odpowiadają wartości danych w słowniku. Aby uzyskać więcej informacji, uruchom polecenie DBCC CHECKDB.

Jeśli te błędy można zapisać danych nieuszkodzone przez luzem eksportowania danych kolumny nie mają wpływu/rowgroups i ponowne ładowanie danych po upuszczeniu lub tworzenie indeksu klastrowanego magazynu kolumn. Flagi śledzenia 10207 pominąć ten błąd 5288 i powrócić do starego zachowania pomijanie uszkodzonych rowgroups powinna być włączona.

Uwaga: Komunikaty o błędach 5288 i 5289 są generowane dla tej rowgroup R3, który składa się z segmentu S3. Flagi śledzenia 10207 służy do wyodrębniania segmentów rowgroup R3, których nie dotyczy słownika Brak D1.

Kwerendy dla baz danych, których dotyczy luka

Aby ustalić, czy bazy danych, która zawiera indeksy jest już narażony na ten problem, uruchom następującą kwerendę:
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ć tę kwerendę przeciwko każdej bazy danych, która zawiera indeksy na serwerze z programem SQL Server. Pusty zestaw wyników wskazuje, że baza danych nie zostanie naruszona.
  • Wykonać tej kwerendy w okresie gdy nic się nie dzieje, który utworzy nowy rowgroups lub zmienić stan istniejących rowgroups. Na przykład, następujące działania można zmodyfikować stan rowgroups: budowanie indeksu, reorganizacja indeksu, instrukcja bulk insert, mover krotki kompresji różnicowej sklepów.

    Przed wykonaniem kwerendy można wyłączyć za pomocą flagi śledzenia 634 zadania przenoszenia krotka w tle. Polecenie to pozwala wyłączyć zadania w tle: DBCC TRACEON (634, -1). Po zakończeniu wykonywania kwerendy należy pamiętać ponownie włączyć zadania w tle przy użyciu polecenia: DBCC TRACEOFF (634, -1).

    Upewnij się również nie ma żadnych BULK INSERT/BCP/SELECT-do poleceń Wstawianie danych do tabel, które używają magazynu kolumn indeksu, ta kwerenda jest uruchomiona.

    Zalecane jest Użyj tych kroków, aby uniemożliwić zwrócenie fałszywy pozytywny kwerendy.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji „Dotyczy”.

Ostrzeżenie: ten artykuł przetłumaczono automatycznie

Właściwości

Identyfikator artykułu: 3067257 — ostatni przegląd: 07/26/2015 07:53:00 — zmiana: 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 KbMtpl
Opinia
var Ctrl = ""; document.write(" mTracker.init();