Sdílet prostřednictvím


In-Memory scénáře použití a přehledu OLTP

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

In-Memory OLTP je špičková technologie dostupná v SQL Serveru a SQL Database pro optimalizaci výkonu zpracování transakcí, příjmu dat, načítání dat a přechodných scénářů dat. Tento článek obsahuje přehled technologie a popisuje scénáře použití pro In-Memory OLTP. Tyto informace slouží k určení, jestli je In-Memory OLTP pro vaši aplikaci vhodné. Článek končí příkladem, který ukazuje In-Memory objekty OLTP, odkaz na ukázku výkonu a odkazy na prostředky, které můžete použít pro další kroky.

Přehled In-Memory OLTP

In-Memory OLTP může poskytovat skvělé zvýšení výkonu pro správné úlohy. I když zákazníci v některých případech zaznamenali až 30X zvýšení výkonu, to, kolik získáte, závisí na úloze.

Odkud tento výkon pochází? V podstatě In-Memory OLTP zlepšuje výkon zpracování transakcí tím, že zefektivňuje přístup k datům a provádění transakcí a odebírá kolize zámků a západek mezi souběžným prováděním transakcí. In-Memory OLTP není rychlý, protože je v paměti; je to rychlé kvůli optimalizaci dat v paměti. Algoritmy pro ukládání dat, přístup a zpracování byly od základů přepracovány, aby využívaly nejnovější vylepšení v paměti a vysoko souběžnosti.

Právě proto, že data jsou v paměti, neznamená, že je ztratíte, když dojde k selhání. Ve výchozím nastavení jsou všechny transakce plně odolné, což znamená, že máte stejné záruky stálosti, které získáte pro jakoukoli jinou tabulku v SQL Serveru: v rámci potvrzení transakce se všechny změny zapisují do transakčního protokolu na disku. Pokud dojde k selhání kdykoli po potvrzení transakce, data tam jsou, když se databáze vrátí do online režimu. Kromě toho In-Memory OLTP funguje se všemi možnostmi vysoké dostupnosti a zotavení po havárii SQL Serveru, jako jsou skupiny dostupnosti, instance clusteru s podporou převzetí služeb při selhání, zálohování/obnovení atd.

Pokud chcete ve své databázi použít In-Memory OLTP, použijte jeden nebo více následujících typů objektů:

  • Tabulky optimalizované pro paměť se používají k ukládání uživatelských dat. Deklarujete tabulku, která se má optimalizovat při vytváření.
  • Tabulky, které nejsou odolné , se používají pro přechodná data, a to buď pro ukládání do mezipaměti, nebo pro zprostředkující sadu výsledků (nahrazení tradičních dočasných tabulek). Tabulka, která není odolná, je tabulka optimalizovaná pro paměť, která je deklarována pomocí DURABILITY=SCHEMA_ONLY, což znamená, že změny těchto tabulek neúčtují žádné vstupně-výstupní operace. Tím se vyhnete využívání prostředků vstupně-výstupních operací protokolu v případech, kdy stálost není problém.
  • Typy tabulek optimalizované pro paměť se používají pro parametry s hodnotami tabulky (TVP) a přechodné sady výsledků v uložených procedurách. Typy tabulek optimalizované pro paměť je možné použít místo tradičních typů tabulek. Proměnné tabulek a TVP deklarované pomocí typu tabulky optimalizované pro paměť dědí výhody tabulek optimalizovaných pro paměť: efektivní přístup k datům a žádné vstupně-výstupní operace.
  • Nativně kompilované moduly T-SQL se používají k dalšímu zkrácení doby potřebné pro jednotlivé transakce snížením cyklů procesoru potřebných ke zpracování operací. Deklarujete modul Transact-SQL, který se má nativně zkompilovat při vytváření. V tuto chvíli je možné nativně zkompilovat následující moduly T-SQL: uložené procedury, triggery a skalární uživatelem definované funkce.

In-Memory OLTP je integrovaný do SQL Serveru a SLUŽBY SQL Database. Vzhledem k tomu, že se tyto objekty chovají podobným způsobem jako jejich tradiční protějšky, můžete často získat výhody výkonu a zároveň provádět pouze minimální změny v databázi a aplikaci. Navíc můžete mít ve stejné databázi tabulky optimalizované pro paměť i tradiční diskové tabulky a spouštět dotazy napříč dvěma. Podívejte se na ukázkový Transact-SQL skript pro každý z těchto typů objektů dále v tomto článku.

Scénáře použití pro In-Memory OLTP

In-Memory OLTP není kouzelné tlačítko pro rychlý přechod a není vhodné pro všechny úlohy. Například tabulky optimalizované pro paměť nepřinášejí využití procesoru, pokud většina dotazů provádí agregaci nad velkými rozsahy dat. Indexy Columnstore vám s tímto scénářem pomůžou.

Upozornění

Známý problém: U databází s tabulkami optimalizovanými pro paměť může provedení zálohování transakčního protokolu bez obnovení a pozdější spuštění obnovení transakčního protokolu s obnovením způsobit nereagující proces obnovení databáze. Tento problém může mít vliv také na funkci přesouvání protokolů. Chcete-li tento problém vyřešit, může být instance SYSTÉMU SQL Server restartována před zahájením procesu obnovení.

Tady je seznam scénářů a vzorů aplikací, ve kterých jsme viděli, že zákazníci byli úspěšní s In-Memory OLTP.

Zpracování transakcí s vysokou propustností a nízkou latencí

Toto je základní scénář, pro který jsme vytvořili In-Memory OLTP: podporují velké objemy transakcí s konzistentní nízkou latencí pro jednotlivé transakce.

Mezi běžné scénáře úloh patří obchodování s finančními nástroji, sportovními sázkami, mobilními hrami a doručováním reklam. Dalším běžným vzorem je "katalog", který se často čte a/nebo aktualizuje. Jedním z příkladů je, že máte velké soubory, každý distribuovaný přes několik uzlů clusteru a vy katalogujete umístění jednotlivých horizontálních oddílů každého souboru v tabulce optimalizované pro paměť.

Na co myslet při implementaci

Pro základní transakční tabulky používejte tabulky optimalizované pro paměť, to znamená tabulky s nejvýkonnějšími transakcemi. Nativně zkompilované uložené procedury slouží k optimalizaci provádění logiky přidružené k obchodní transakci. Čím více logiky můžete vysunout do uložených procedur v databázi, tím výhodou je In-Memory OLTP.

Začínáme s existující aplikací:

  1. Pomocí sestavy analýzy výkonu transakcí identifikujte objekty, které chcete migrovat.
  2. Pomoc s migrací vám pomůže poradce pro optimalizaci paměti a nativní poradce pro kompilaci .

Příjem dat, včetně IoT (Internet věcí)

In-Memory OLTP je dobrý při ingestování velkých objemů dat z mnoha různých zdrojů najednou. A často je výhodné ingestovat data do databáze SQL Serveru v porovnání s jinými cíli, protože SQL Server provádí spouštění dotazů na data rychle a umožňuje získat přehledy v reálném čase.

Mezi běžné vzory aplikací patří:

  • Ingestování čtení a událostí snímačů a povolení oznámení a historické analýzy.
  • Správa dávkových aktualizací, i z více zdrojů, a zároveň minimalizace dopadu na souběžnou úlohu čtení.

Na co myslet při implementaci

Pro příjem dat použijte tabulku optimalizovanou pro paměť. Pokud se příjem dat skládá převážně z vložení (nikoli aktualizací) a In-Memory nároky na úložiště OLTP jsou obavy, a to buď

  • Použijte úlohu k pravidelnému dávkovému snižování zátěže dat do diskové tabulky s clusterovaným indexem columnstore pomocí úlohy, která provádí INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; nebo
  • Pomocí dočasné tabulky optimalizované pro paměť můžete spravovat historická data – v tomto režimu se systémem spravuje historická data na disku a přesun dat.

Úložiště ukázek SQL Serveru obsahuje aplikaci inteligentní mřížky, která používá dočasnou tabulku optimalizovanou pro paměť, typ tabulky optimalizovanou pro paměť a nativně zkompilovanou uloženou proceduru pro urychlení příjmu dat při správě In-Memory využití úložiště OLTP dat snímače:

Ukládání do mezipaměti a stav relace

Technologie In-Memory OLTP vytváří databázový stroj v databázích SQL Serveru nebo Azure SQL atraktivní platformu pro udržování stavu relace (například pro aplikaci ASP.NET) a ukládání do mezipaměti.

ASP.NET stav relace je úspěšný případ použití In-Memory OLTP. S SQL Serverem se jeden zákazník chystá dosáhnout 1,2 milionu požadavků za sekundu. Mezitím začali používat In-Memory OLTP pro potřeby ukládání do mezipaměti všech aplikací střední vrstvy v podniku. Podrobnosti: Jak bwin používá SQL Server 2016 (13.x) In-Memory OLTP k dosažení mimořádného výkonu a škálování

Na co myslet při implementaci

Tabulky optimalizované pro paměť můžete použít jako jednoduché úložiště klíč-hodnota uložením objektu BLOB do sloupce varbinary(max). Alternativně můžete implementovat částečně strukturovanou mezipaměť s podporou JSON v SQL Serveru a SQL Database. Nakonec můžete vytvořit úplnou relační mezipaměť prostřednictvím nestálých tabulek s úplným relačním schématem, včetně různých datových typů a omezení.

Začínáme s optimalizací paměti ASP.NET stavu relace pomocí skriptů publikovaných na GitHubu k nahrazení objektů vytvořených integrovaným poskytovatelem stavu relace SQL Serveru: aspnet-session-state

Případová studie zákazníka

Nahrazení objektu tempdb

K nahrazení tradičních tempdb struktur založených na tradičních strukturách, jako jsou dočasné tabulky, proměnné tabulek a parametry s hodnotami tabulky (TVPs), použijte nestáhnoucí tabulky a typy tabulek optimalizované pro paměť.

Proměnné tabulek optimalizované pro paměť a tabulky, které nejsou odolné, obvykle snižují vstupně-výstupní operace procesoru a zcela odeberou vstupně-výstupní operace protokolu ve srovnání s tradičními proměnnými tabulek a #temp tabulkou.

Na co myslet při implementaci

Začínáme: Vylepšení výkonu dočasných tabulek a proměnných tabulek pomocí optimalizace paměti

Případová studie zákazníka

ETL (extrakce načítání transformace)

Pracovní postupy ETL často zahrnují načtení dat do pracovní tabulky, transformace dat a načtení do konečných tabulek.

Pro přípravu dat používejte tabulky optimalizované pro paměť, které nejsou odolné. Úplně odeberou všechny vstupně-výstupní operace a zefektivní přístup k datům.

Na co myslet při implementaci

Pokud v rámci pracovního postupu provádíte transformace pracovní tabulky, můžete tyto transformace urychlit pomocí nativně zkompilovaných uložených procedur. Pokud můžete tyto transformace provádět paralelně, získáte další výhody škálování z optimalizace paměti.

Ukázkový skript

Než začnete používat In-Memory OLTP, musíte vytvořit skupinu souborů MEMORY_OPTIMIZED_DATA. Kromě toho doporučujeme použít úroveň kompatibility databáze 130 (nebo vyšší) a nastavit možnost databáze MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT na ZAPNUTO.

Skript můžete použít v následujícím umístění k vytvoření skupiny souborů ve výchozí datové složce a konfiguraci doporučených nastavení:

Následující ukázkový skript znázorňuje In-Memory objekty OLTP, které můžete vytvořit ve své databázi.

Nejprve začněte konfigurací databáze pro In-Memory OLTP.

-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
GO

Tabulky můžete vytvářet s různou odolností:

-- memory-optimized table
CREATE TABLE dbo.table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON);
GO
-- non-durable table
CREATE TABLE dbo.temp_table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON,
      DURABILITY=SCHEMA_ONLY);
GO

Typ tabulky můžete vytvořit jako tabulku v paměti.

-- memory-optimized table type
CREATE TYPE dbo.tt_table1 AS TABLE
( c1 INT IDENTITY,
  c2 NVARCHAR(MAX),
  is_transient BIT NOT NULL DEFAULT (0),
  INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
WITH (MEMORY_OPTIMIZED=ON);
GO

Můžete vytvořit nativně zkompilovanou uloženou proceduru. Další informace naleznete v tématu Volání nativně zkompilovaných uložených procedur z aplikací pro přístup k datům.

-- natively compiled stored procedure
CREATE PROCEDURE dbo.usp_ingest_table1
  @table1 dbo.tt_table1 READONLY
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC
    WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT,
          LANGUAGE=N'us_english')

  DECLARE @i INT = 1

  WHILE @i > 0
  BEGIN
    INSERT dbo.table1
    SELECT c2
    FROM @table1
    WHERE c1 = @i AND is_transient=0

    IF @@ROWCOUNT > 0
      SET @i += 1
    ELSE
    BEGIN
      INSERT dbo.temp_table1
      SELECT c2
      FROM @table1
      WHERE c1 = @i AND is_transient=1

      IF @@ROWCOUNT > 0
        SET @i += 1
      ELSE
        SET @i = 0
    END
  END

END
GO
-- sample execution of the proc
DECLARE @table1 dbo.tt_table1;
INSERT @table1 (c2, is_transient) VALUES (N'sample durable', 0);
INSERT @table1 (c2, is_transient) VALUES (N'sample non-durable', 1);
EXECUTE dbo.usp_ingest_table1 @table1=@table1;
SELECT c1, c2 from dbo.table1;
SELECT c1, c2 from dbo.temp_table1;
GO