Rendszerverziójú időtáblák memóriaoptimalizált táblákkal

A következőkre vonatkozik: Sql Server 2016 (13.x) és újabb verziók felügyelt Azure SQL-példány

A memóriaoptimalizált táblák rendszerverziózott időbeli táblái költséghatékony megoldást nyújtanak olyan esetekben, amikor a memóriabeli OLTP-munkaterhelések során gyűjtött adatokhoz adatnaplózásra és adott időpontra vonatkozó elemzésre van szükség.

Note

A memóriaoptimalizált időtáblák csak az SQL Serverben és az Azure SQL Managed Instance-ben érhetők el. A memóriaoptimalizált táblák és az időtáblák egymástól függetlenül érhetők el az Azure SQL Database-ben.

Overview

A rendszer által verziózott időbeli táblák automatikusan megőrzik az adatváltozások teljes előzményeit, és kényelmes Transact-SQL bővítményeket tehetnek elérhetővé a pont-idő elemzéshez. Egy tipikus esetben az adattörténet hosszú ideig (több hónapig, akár évekig) megőrzik, még akkor is, ha nem kérdezik rendszeresen.

Az adataudit és az időalapú elemzés különböző környezetekben is igénylődhet, különösen olyan OLTP rendszerekben, amelyek rendkívül nagy mennyiségű kérést dolgoznak fel, és ahol memórián belüli OLTP technológiát alkalmaznak. A memóriaoptimalizált táblák időbeli forgatókönyvekben való használata azonban kihívást jelent, mivel a létrehozott előzményadatok nagy száma gyakran meghaladja a rendelkezésre álló RAM korlátját. Ugyanakkor a RAM használata nem optimális megoldás az írásvédett előzményadatok tárolására, mivel ezek az adatok ritkábban érhetők el, ahogy öregszenek.

A memóriaoptimalizált táblákhoz szolgáló rendszer-verziójú időbeli táblák magas tranzakciós áteresztőképességet és zárolásmentes párhuzamosságot biztosítanak. Nagy mennyiségű történeti adatot tárolhatsz memórián belüli táblákkal az aktuális adatok tárolására (időbeli táblázat), valamint lemezalapú táblákkal a történelmi adatokhoz. A DML-műveletekre gyakorolt hatás csökkenthető egy belső, automatikusan létrehozott, memóriaoptimalizált előkészítési táblázat használatával, amely a legutóbbi előzményeket tárolja, és lehetővé teszi a DLL-ek natív fordítású kódból történő végrehajtását.

Az alábbi ábra ezt az architektúrát szemlélteti.

Memóriabeli időbeli architektúra diagramja.

Megvalósítás részletei

Rendszerverziójú memóriaoptimalizált tábla létrehozásakor vegye figyelembe az alábbi szempontokat. A szintaxis beállításaiért és egy példaért lásd: CREATE TABLE.

  • Csak a tartós memóriaoptimalizált táblák rendszerváltozatképessé tehetők (DURABILITY = SCHEMA_AND_DATA).

  • A memóriaoptimalizált rendszerverziós táblázat történettáblázatának lemezalapú kell legyen, akár te hozod létre, akár a rendszer készíti.

  • Olyan lekérdezéseket használhatsz, amelyek csak a jelenlegi memórián belüli táblát érintik a natívan fordított T-SQL modulokban. A natívan lefordított modulok nem támogatják a FOR SYSTEM TIME záradékot, de az ad hoc lekérdezések és a nem natívan lefordított modulok használhatják ezt a záradékot a memóriaoptimalizált táblákon.

  • A SYSTEM_VERSIONING = ONrendszer automatikusan létrehoz egy belső memóriaoptimalizált staging táblát, amely elfogadja a legfrissebb rendszerverziós módosításokat, amelyek a jelenlegi memóriaoptimalizált táblázaton végzett frissítési és törlési műveletekből erednek.

  • Az aszinkron adatkiegyenlítési feladat rendszeresen áthelyezi az adatokat a belső memóriaoptimalizált staging táblából a lemezalapú történettáblázatba. Ez az adatöblítési mechanizmus gondoskodik arról, hogy a belső memóriapufferek a szülőobjektumok memóriahasználatának kevesebb mint 10 százalékánál maradjanak. A memóriaoptimalizált, rendszerverzióval ellátott temporális tábla teljes memóriahasználatát a sys.dm_db_xtp_memory_consumers lekérdezésével követheti nyomon, majd az adatokat összegezheti a belső memóriaoptimalizált előkészítő tábla és az aktuális temporális tábla esetében.

  • Az adatkiürítés kézi végrehajtásához futtassa a sp_xtp_flush_temporal_history parancsot.

  • A SYSTEM_VERSIONING = OFF használatakor, illetve amikor egy rendszerverziózott tábla sémáját oszlopok hozzáadásával, törlésével vagy módosításával megváltoztatja, a belső átmeneti puffer teljes tartalma átkerül a lemezalapú előzménytáblába.

  • Az előzményadatok lekérdezése hatékonyan a pillanatfelvétel szintű elkülönítés alatt történik, és mindig visszaadja a memóriában lévő puffer és a lemezen lévő táblázat egyesítését duplikációk nélkül.

  • ALTER TABLE a táblasémát belsőleg módosító műveleteknek adatkiírást kell végrehajtaniuk, ami meghosszabbíthatja a műveletet.

A belső memóriaoptimalizált előkészítési táblázat

A rendszer létrehoz egy belső memóriaoptimalizált előkészítési táblát a DML-műveletek optimalizálásához.

  • A tábla neve a következő formátumot használja: Memory_Optimized_History_Table_<object_id> ahol <object_id> az aktuális időbeli tábla azonosítója.

  • A tábla az aktuális temporális tábla sémáját képezi le, valamint egy bigint oszloppal egészül ki. Ez az extra oszlop garantálja a belső történeti pufferbe áthelyezett sorok egyediségét.

  • Az extra oszlop a következő névformátummal rendelkezik: Change_ID[<suffix>], ahol a <suffix> opcionálisan hozzáadódik abban az esetben, ha a tábla már rendelkezik Change_ID oszlopmal.

  • A rendszerverziójú memóriaoptimalizált táblák maximális sormérete 8 bájttal csökken az előkészítési táblázat extra bigint oszlopa miatt. A maximális érték most 8 052 bájt.

  • A belső, memóriaoptimalizált átmeneti tábla nem látható az SQL Server Management Studio Object Explorerében.

  • A táblázatról és annak kapcsolatáról a jelenlegi időbeli táblával a sys.internal_tables-ben találhatod meg a metaadatokat.

Az adatöblítési feladat

Az adatkiegyenlítés feladat rendszeresen fut, és ellenőrzi, hogy bármely memóriaoptimalizált tábla megfelel-e egy memóriaméret-alapú adatmozgási feltételnek. Az adatmozgás akkor kezdődik, amikor a belső szakaszos tábla memóriafogyasztása eléri az aktuális időbeli tábla memóriafogyasztásának nyolc százalékát.

Az adatöblítési feladat rendszeres aktiválása a meglévő számítási feladattól függően eltérő ütemezéssel történik. Nagy terhelés esetén a feladat 5 másodpercenként fut. Könnyű terhelés esetén a gyakoriság egypercesre emelkedik. Minden olyan belső memóriaoptimalizált előkészítési táblázathoz, amely tisztítást igényel, egy szál jön ki.

Az adatöblítés törli az összes rekordot a memóriában lévő belső pufferből, amely régebbi a legrégebbi jelenleg futó tranzakciónál, hogy ezeket a rekordokat a lemezalapú előzménytáblába helyezze át.

Az adatöblítést a sp_xtp_flush_temporal_history futtatásával és a séma és a tábla nevének megadásával hajthatja végre:

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

A rendszer ugyanazt az adatáthelyezési folyamatot hívja meg, mint amikor a rendszer belső ütemezés szerint hajtja végre az adatöblítési feladatot.