Sdílet prostřednictvím


Systémově verzované časové tabulky s tabulkami optimalizovanými pro paměť

platí pro: SQL Server 2016 (13.x) a novější azure SQL Managed Instance

Dočasné tabulky optimalizované pro systémovou verzi pro tabulky optimalizované pro paměť poskytují nákladově efektivní řešení pro scénáře, kdy audit dat a analýzu k určitému bodu v čase jsou vyžadovány nad daty shromážděnými s In-Memory úlohami OLTP.

Poznámka

Dočasné tabulky optimalizované pro paměť jsou k dispozici pouze v SQL Serveru a azure SQL Managed Instance. Tabulky optimalizované pro paměť a dočasné tabulky jsou nezávisle dostupné ve službě Azure SQL Database.

Přehled

Systémové verze časových tabulek automaticky udržují úplnou historii změn dat a zpřístupňují praktická rozšíření Transact-SQL pro analýzu k určitému bodu v čase. V typickém scénáři je historie dat uchovávána po dlouhou dobu (několik měsíců nebo i let), přestože není pravidelně dotazována.

Audit dat a časová analýza mohou být požadovány v různých prostředích, zejména v systémech OLTP, které zpracovávají extrémně velký počet požadavků a kde se používá technologie In-Memory OLTP. Použití tabulek optimalizovaných pro paměť v dočasných scénářích je ale náročné, protože velké množství vygenerovaných historických dat běžně překračuje limit dostupné paměti RAM. Použití paměti RAM k ukládání historických dat jen pro čtení, ke kterým se přistupuje méně často, protože se stává starším, není optimálním řešením.

Systémem verzované časové tabulky pro tabulky optimalizované pro paměť poskytují vysokou propustnost transakcí a souběžnost bez uzamykání. Umožňují ukládat velké množství dat historie pomocí tabulek v paměti pro ukládání aktuálních dat (dočasná tabulka) a tabulek založených na disku pro historická data. Účinek na operace DML se snižuje použitím interní, automaticky generované přechodné tabulky optimalizované pro paměť, která ukládá nedávnou historii a umožňuje provádět operace DML z nativně zkompilovaného kódu.

Následující diagram znázorňuje tuto architekturu.

diagram dočasné architektury v paměti

Podrobnosti implementace

Při vytváření tabulky optimalizované pro systémovou verzi paměti mějte na paměti následující aspekty. Možnosti syntaxe a příklad najdete v části CREATE TABLE.

  • Pouze odolné paměťově optimalizované tabulky mohou být verzovány systémem (DURABILITY = SCHEMA_AND_DATA).

  • Tabulka historie pro tabulku optimalizovanou pro systémovou verzi musí být založená na disku bez ohledu na to, jestli ji vytvořil koncový uživatel nebo systém.

  • Dotazy, které ovlivňují pouze aktuální tabulku v paměti, lze použít v nativně kompilovaných modulech T-SQL . Dočasné dotazy používající klauzuli FOR SYSTEM TIME nejsou v nativně kompilovaných modulech podporované. Klauzule FOR SYSTEM TIME se podporuje u tabulek optimalizovaných pro paměť v ad hoc dotazech a ne nativních modulech.

  • S SYSTEM_VERSIONING = ONse automaticky vytvoří interní pracovní tabulka optimalizovaná pro paměť, která přijme nejnovější změny ve verzi systému, což jsou výsledky operací aktualizace a odstranění v aktuální tabulce optimalizované pro paměť.

  • Data z interní pracovní tabulky optimalizované pro paměť se pravidelně přesouvají do tabulky historie založené na disku pomocí asynchronní úlohy vyprázdnění dat. Tento mechanismus vyprázdnění dat udržuje interní vyrovnávací paměti na úrovni méně než 10 % použití paměti jejich nadřazených objektů. Celkovou spotřebu paměti dočasné tabulky optimalizované pro systémovou verzi můžete sledovat dotazováním sys.dm_db_xtp_memory_consumersa shrnutím dat pro interní pracovní tabulku optimalizovanou pro paměť a aktuální dočasnou tabulku.

  • Data můžete vyprázdnit ručně spuštěním sp_xtp_flush_temporal_history.

  • Při použití SYSTEM_VERSIONING = OFFnebo při úpravě schématu tabulky se systémovou verzí přidáním, vyřazením nebo změnou sloupců se celý obsah interní zkušební vyrovnávací paměti přesune do historické tabulky založené na disku.

  • Dotazování historických dat probíhá efektivně na úrovni izolace snímků a vždy vrací sjednocení dat mezi paměťovou vyrovnávací pamětí a tabulkou na disku bez duplicit.

  • ALTER TABLE operací, které interně mění schéma tabulky, musí provádět vyprázdnění dat, což může prodloužit dobu trvání operace.

Pracovní tabulka optimalizovaná pro interní paměť

Systém vytvoří interní pracovní tabulku optimalizovanou pro paměť pro optimalizaci operací DML.

  • Název tabulky je generován v následujícím formátu: Memory_Optimized_History_Table_<object_id>, kde <object_id> je identifikátor aktuální dočasné tabulky.

  • Tabulka replikuje schéma aktuální časové tabulky plus jeden sloupec bigint. Tento dodatečný sloupec zaručuje jedinečnost řádků přesunutých do interního historického vyrovnávacího bufferu.

  • Další sloupec má následující formát názvu: Change_ID[<suffix>], kde <suffix> je volitelně přidán v případě, že tabulka již obsahuje sloupec Change_ID.

  • Maximální velikost řádku pro tabulku optimalizovanou pro systémovou verzi paměti se zmenší o 8 bajtů kvůli nadbytečné bigint sloupci v pracovní tabulce. Nové maximum je teď 8 052 bajtů.

  • Pracovní tabulka optimalizovaná pro interní paměť není reprezentována v Průzkumníku objektů aplikace SQL Server Management Studio.

  • Metadata o této tabulce a její spojení s aktuální dočasnou tabulkou najdete v sys.internal_tables.

Úloha vyprázdnění dat

Vyprázdnění dat je pravidelně aktivovaná úloha, která kontroluje, jestli nějaká tabulka optimalizovaná pro paměť splňuje podmínku na základě velikosti paměti pro přesun dat. Přesun dat začíná, když spotřeba paměti interní pracovní tabulky dosáhne osmi procent spotřeby paměti aktuální časové tabulky.

Úloha pročištění dat se pravidelně aktivuje podle plánu, který se liší v závislosti na stávající pracovní zátěži. Při náročném zatížení se úloha spouští tak často jako každých 5 sekund. S malým zatížením se frekvence zvyšuje na každou minutu. Jedno vlákno je vytvářeno pro každou interní pracovní tabulku optimalizovanou pro paměť, která potřebuje vyčištění.

Vyprázdnění dat odstraní všechny záznamy z interní vyrovnávací paměti, které jsou starší než nejstarší aktuálně spuštěné transakce, aby se tyto záznamy přesunuly do tabulky historie založené na disku.

Spuštěním sp_xtp_flush_temporal_history a zadáním názvu schématu a tabulky můžete spustit vyprázdnění dat:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

Stejný proces přesunu dat se vyvolá, jako když systém spustí úlohu vyprázdnění dat podle svého interního plánu.