Tento článek popisuje problém, ke kterému dochází při dotazu na clusterovaný index columnstore v Microsoft SQL serveru 2014. Tento článek obsahuje řešení tohoto problému.

Shrnutí

Když použijete dotaz, který skenuje clusterovaný index columnstore v Microsoft SQL serveru 2014, můžete za vzácných podmínek přijmout částečné výsledky dotazu. Tento problém nastane, když se spustí následující operace.

Krok 1

Příkaz Transact-SQL [INSERT nebo BULK-INSERT] vloží data do tabulky, která obsahuje clusterovaný index columnstore. Během této operace platí následující podmínky:

  • Když příkaz Transact-SQL dosáhne mezní hodnoty rowgroup, zavře rowgroup R1 s segmentem S1.

  • Segment S1 ukazuje na místní slovník D1.

  • Příkaz pokračuje v vkládání řádků do nového rowgroup R2.

  • Když je rowgroup R1 zavřený, nemusí být místní slovník D1 zavřen. Pokud má slovník D1 stále volné místo, můžete ho nechat otevřený a znovu ho použít pro nové rowgroup R2.

Krok 2

Pokud je příkaz Transact-SQL před zavřením nového rowgroup R2 neobvyklý nebo zrušený, platí následující podmínky:

  • Změny metadat columnstore se vyskytují v podtransakcích, které se potvrzují nezávisle na vnější transakci.

  • V tomto okamžiku rowgroup R1 přetrvává v systémové tabulce v "v konstrukci" nebo v neviditelném stavu a ve slovníku D1 "References Dictionary".

  • V systémové tabulce pro slovník D1 není vytvořen žádný řádek. Důvodem je to, že příkaz Transact-SQL nikdy nemůže zavřít stávající řádek. Stávající řádek tedy přetrvá.

Krok 3

V typické situaci, pokud úkol výrobce řazené kolekce členů na pozadí začne po skončení příkazu Transact-SQL, odstraní úloha pozadí neviditelný rowgroup R1 a segment S1. Pokud je spuštěn nový příkaz Transact-SQL a vytvoří rowgroup R3, který má nový segment S3, který vyžaduje nový místní slovník, nemůžete znovu použít vnitřní ID slovníku D1. Je to proto, že stav v paměti columnstore udržuje přehled o použitých ID slovníku. Proto segment S3 bude odkazovat na nový slovník D2.Poznámka Podmínka v tomto kroku je běžná. Nedojde proto k žádnému poškození.

Krok 4

Pokud SQL Server ztratí stav ve slovníku D1 v paměti před tím, než se uplatní úloha stěhovacího systému záznamů, (a provede se tak, jak je popsáno v kroku 3), nastane problém popsaný v tomto článku.Poznámky:

  • K této události dochází z některého z následujících důvodů:

    • Přetížení paměti prostředí SQL serveru a obsah v paměti ve slovníku D1 je odstraněn z paměti.

    • Instance systému SQL Server se restartuje.

    • Databáze obsahující clusterovaný index columnstore přejde do offline režimu a pak se vrátí do online režimu.

  • Po výskytu některé z těchto událostí a když SQL Server znovu načte struktury v paměti, není žádný záznam, že existoval slovník D1 a jeho interní ID. Je to proto, že slovník D1 nebyl zachován v systémových tabulkách, když byl příkaz Transact-SQL ukončen nebo conceled.

  • Pokud úloha "na pozadí" v průběhu řazené kolekce členů začne v tomto okamžiku, nedochází k žádným chybám, protože se používají podmínky popsané v kroku 3.

  • Pokud je vytvořen nový rowgroup R3 před zahájením úkolu na pozadí v konzoli řazené kolekce členů (za předchozí odrážku), SQL Server přiřadí stejné interní ID k novému slovníku D1 a odkazuje na slovník D1 pro segment S3 v rowgroup R3.

  • Když úkol stěhovací společnosti Tuple začne po předchozí akci, bude mít neviditelný rowgroup R1 a jeho segmenty S1 společně s novým slovníkem D1. K této situaci dochází, protože stěhovací společnosti prochází, že nový slovník D1 a původní slovník D1, že jsou odkazy S1 stejné.Poznámka Když nastane tento stav, nelze zadávat dotazy na obsah rowgroup R3.

Řešení

Tento problém byl poprvé opraven v následujících kumulativních aktualizacích systému SQL Server:

Kumulativní aktualizace 1 pro SQL server 2014 SP1, kumulativní aktualizace 8 pro SQL Server 2014Oprava tohoto problému je také součástí následujících aktualizací GDR (General Distribution Release):

Aktualizace zabezpečení pro SQL Server 2014 QFE  Tato aktualizace obsahuje kumulativní aktualizaci 8, tuto důležitou opravu a požadované aktualizace zabezpečení MS15-058.Aktualizace zabezpečení pro SQL Server 2014 GDR  Tato aktualizace zahrnuje tyto důležité opravy a kumulativní opravy zabezpečení prostřednictvím MS15-058.Aktualizace nezabezpečení pro SQL Server 2014 Service Pack 1 GDR  Tato aktualizace zahrnuje jenom tuto důležitou opravu.

Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace SQL serveru:

Další informace

Chybové zprávyPokud v aktuálně spuštěné databázi spustíte příkaz DBCC CHECKDB po použití této opravy, zobrazí se následující chybová zpráva:

Msg 5289, úroveň 16, stav 1, řádek 1 clusterovaný index columnstore "v tabulce 't" obsahuje jednu nebo více datových hodnot, které neodpovídají hodnotám dat ve slovníku. Obnovte data ze zálohy.

Když v aktuálně spuštěné databázi spustíte dotaz, který zkontroluje, které tabulky jsou v dané tabulce, po použití této opravy se zobrazí tato chybová zpráva:

Msg 5288, úroveň 16, stav 1, řádek 1 index columnstore obsahuje jednu nebo více datových hodnot, které neodpovídají hodnotám dat ve slovníku. Další informace získáte spuštěním příkazu DBCC CHECKDB.

Pokud se tyto chyby dostanou, můžete nepoškozená data uložit hromadným exportem dat neovlivněných sloupců/rowgroups a po přetažení nebo vytvoření clusterovaného indexu columnstore data znovu načíst. Chcete-li potlačit chybu 5288 a obnovit staré chování při přeskakování poškozených rowgroups, povolte příznak Trace. 10207. PoznámkaPro tuto rowgroup R3, která má segment S3, se generují chybové zprávy 5288 a 5289. Příznak Trace 10207 se používá k extrakci segmentů rowgroup R3, které nemají vliv chybějícím slovníkem D1.

Dotaz na ovlivněné databázePokud chcete zjistit, jestli se tento problém týká databáze obsahující indexy columnstore, spusťte následující dotaz:

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 

Poznámky:

  • Tento dotaz musíte spustit u každé databáze, která obsahuje indexy columnstore na serveru, na kterém běží SQL Server. Prázdná sada výsledků označuje, že se nejedná o chybu databáze.

  • Tento dotaz spusťte během období, kdy neexistuje žádná aktivita, která by vytvořila novou rowgroups nebo změnila stav existujících rowgroups. Následující aktivity mohou například měnit stav rowgroups: vytvoření indexu, přeuspořádání indexu, hromadné vložení, vytvoření řazené kopie (Tuple). Před spuštěním dotazu můžete vypnout úlohu programu záznamové práce na pozadí pomocí příznaku trasování 634. Pomocí tohoto příkazu zakažte úlohu na pozadí: DBCC TRACEON (634;-1). Po dokončení dotazu můžete úlohu na pozadí znovu povolit pomocí příkazu: DBCC TRACEOFF (634,-1). Také se ujistěte, že neexistují žádné příkazy BULK INSERT/BCP/SELECT-INTO, které vkládají data do tabulek, které používají index columnstore, když tento dotaz běží. Tento postup doporučujeme použít, pokud chcete, aby dotaz nevrátil falešně pozitivní výsledek.

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.

Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojit se k programu Microsoft Insider

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?

Děkujeme vám za zpětnou vazbu.

×