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

Platí pro: SQL Server 2016 (13.x) a novější verze Azure SQL Managed Instance

Systémově verzované časové tabulky pro tabulky optimalizované pro paměť představují cenově výhodné řešení pro scénáře, kdy je vyžadován audit dat a analýza k určitému časovému okamžiku nad daty shromážděnými pomocí pracovních zátěží OLTP v paměti.

Note

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.

Overview

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 dlouhou dobu (několik měsíců, dokonce i let), i když není pravidelně dotazována.

Audit dat a časově založená analýza mohou být vyžadovány v různých prostředích, zejména v OLTP systémech, které zpracovávají extrémně velké množství požadavků a kde se používá technologie OLTP v paměti. 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.

Systemově verzované časové tabulky pro tabulky optimalizované pro paměť poskytují vysokou transakční propustnost a bezproblémovou souběžnost. Velké množství historických dat můžete uložit pomocí tabulek v paměti pro ukládání aktuálních dat (časová tabulka) a diskových tabulek 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 tématu CREATE TABLE.

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

  • Tabulka historie pro paměťově optimalizovanou systémově verzi tabulky musí být disková, ať už ji vytvoříte vy nebo systém.

  • Můžete použít dotazy, které ovlivňují pouze aktuální tabulku v paměti, v nativně kompilovaných T-SQL modulech. Nativně kompilované moduly tuto FOR SYSTEM TIME klauzuli nepodporují, ale ad hoc dotazy a nenativní moduly mohou klauzuli použít proti tabulkám optimalizovaným pro paměť.

  • S SYSTEM_VERSIONING = ON systém automaticky vytvoří interní paměťově optimalizovanou přechodnou tabulku pro přijímání nejnovějších změn verzovaných systémem, které jsou výsledkem operací aktualizace a odstranění v aktuální paměťově optimalizované tabulce.

  • Asynchronní úloha vyprázdnění dat pravidelně přesouvá data z interní paměťově optimalizované pracovní tabulky do diskové tabulky historie. 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 v paměťově optimalizované systémově verzí časové tabulky můžete sledovat dotazováním sys.dm_db_xtp_memory_consumers a shrnutím dat pro interní paměťově optimalizovanou staging tabulku a aktuální časovou tabulku.

  • Pro ruční proplnění dat spusťte sp_xtp_flush_temporal_history.

  • Pomocí SYSTEM_VERSIONING = OFF, nebo když upravíte schéma tabulky verzí systému přidáním, vynecháním nebo změnou sloupců, je celý obsah interního staging bufferu přesunut do tabulky historie 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 operace, které interně mění schéma tabulky, musí provést proplachování dat, což může operaci prodloužit.

Pracovní tabulka optimalizovaná pro interní paměť

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

  • Název tabulky používá následující formát: Memory_Optimized_History_Table_<object_id> kde <object_id> je identifikátor aktuální časové tabulky.

  • Tabulka kopíruje schéma aktuální temporální tabulky a navíc jeden sloupec bigint. Tento dodatečný sloupec zaručuje jedinečnost řádků přesunutých do interního bufferu historie.

  • 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. Maximální kapacita je nyní 8 052 bajtů.

  • Interní paměťově optimalizovaná pracovní tabulka se nezobrazuje v aplikaci Průzkumník objektů nástroje SQL Server Management Studio.

  • Metadata o této tabulce a jejím propojení s aktuální časovou tabulkou najdete v sys.internal_tables.

Úloha vyprázdnění dat

Úloha proplachování dat běží pravidelně a kontroluje, zda některá tabulka optimalizovaná pro paměť splňuje podmínku pro přesun dat založenou na velikosti paměti. Přesun dat začíná, když spotřeba paměti interní přípravné tabulky dosáhne osmi procent spotřeby paměti aktuální temporální 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.