Toto je druhý článek ze série článků o SQL Server In-Memory OLTP.
Úvodní článek — SQL Server In-Memory OLTP stručně představil základy nového enginu Hekaton. V tomto díle se zaměříme na praxi. Abychom byli konkrétnější, uvidíme, jak vytvářet databáze a tabulky optimalizované pro paměť a také jak je vyhodnocovat pomocí T-SQL.
Předpoklady pro zahájení používání databází optimalizovaných pro paměť
In-memory OLTP se automaticky instaluje s 64bitovou verzí Enterprise nebo Developer SQL Server 2014 nebo SQL Server 2016. 32bitová verze SQL Server neposkytuje součásti In-Memory OLTP.
Pokud tedy máte na svém počítači nainstalovanou 64bitovou edici Developer SQL Server, můžete začít vytvářet databáze a datové struktury, které budou ukládat data optimalizovaná pro paměť bez nastavování doplňků.
Každá jednotlivá databáze, která bude obsahovat tabulky optimalizované pro paměť, by měla obsahovat jednu skupinu souborů MEMORY_OPTIMIZED_DATA. Tato skupina souborů obsahuje jeden nebo několik kontejnerů. Každý jednotlivý kontejner ukládá data a/nebo delta soubory. SQL Server používá tyto soubory k obnovení tabulek optimalizovaných pro paměť. Kontejnery lze umístit na různá disková pole,
podobně jako skupiny souborů FILESTREAM.
Syntaxe pro vytváření skupiny souborů optimalizovaných pro paměť je téměř stejná jako pro tradiční skupinu souborů FILESTREAM, s několika rozdíly:
- Pro databázi lze vytvořit pouze jednu skupinu souborů optimalizovanou pro paměť.
- Volba CONTAINS MEMORY_OPTIMIZED_DATA musí být specifikována explicitně.
Skupinu souborů můžete vytvořit v procesu vytváření databáze:
CREATE DATABASE InMemoryDemo ON PRIMARY ( NAME = N'InMemoryDemo', FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf' ), FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = N'InMemoryDemo_Data', FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf' )
Případně můžete přidat skupinu souborů MEMORY_OPTIMIZED_DATA do existující databáze a poté přidat soubory do této skupiny souborů.
-- Adding the containers ALTER DATABASE DemoDB ADD FILE ( NAME = 'DemoDB_Mod', FILENAME = 'D:\Data\DemoDB_Mod' ) TO FILEGROUP DemoDB_Mod
Interně používá In-Memory OLTP mechanismus streamování založený na technologii FILESTREAM, která je dobře přizpůsobena pro sekvenční I/O přístup.
Vytváření tabulek optimalizovaných pro paměť
Nyní máme vše, co potřebujeme, abychom mohli začít vytvářet objekty optimalizované pro paměť. Pojďme vytvořit tabulku optimalizovanou pro paměť.
Syntaxe pro vytváření tabulek optimalizovaných v paměti je velmi podobná syntaxi pro vytváření tabulek na disku. Existuje však několik rozšíření a omezení:
- Klauzule MEMORY_OPTIMIZED =ON označuje tabulku jako optimalizovanou v paměti.
- Tabulky optimalizované v paměti nepodporují všechny datové typy, které podporují tradiční tabulky. Následující datové typy nejsou podporovány:
- datetimeoffset
- geografie
- geometrie
- hierarchyid
- verze řádku
- XML
- sql_variant
- Uživatelem definované typy
Paměťově optimalizovanou tabulku lze vytvořit s následujícími hodnotami trvanlivosti:SCHEMA_AND_DATA nebo SCHEMA_ONLY. SCHEMA_AND_DATA je výchozí hodnota.
Pokud zadáte SCHEMA_ONLY, nebudou protokolovány všechny změny v tabulce a data tabulky nebudou uložena na disku.
Každá jednotlivá tabulka optimalizovaná pro paměť musí obsahovat alespoň jeden index. Všimněte si, že omezení PRIMARY KEY implicitně vytváří index. Trvalá tabulka s optimalizovanou pamětí vždy vyžaduje omezení PRIMARY KEY.
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Po vytvoření všech sloupců lze přidat složené indexy:
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City]) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Když vytvoříte tabulku optimalizovanou v paměti, modul In-Memory OLTP vytvoří rutiny DML, aby bylo možné k této tabulce přistupovat. Načte rutiny jako soubory DLL. Pro konkrétní operaci zavolá SQL Server požadovaný soubor DLL.
Změna tabulek a indexů
Před SQL Serverem 2016 nebylo možné ALTER tabulky. Chcete-li provést změny schématu, museli jste zrušit a znovu vytvořit tabulku v paměti.
V nové verzi SQL Serveru je ALTER TABLE částečně podporována.
SQL Server 2016 vám poskytuje možnost provádět operace offline:přidávat a rušit (upravovat) sloupce, indexy a omezení. Nyní je také možné pracovat s tabulkami v paměti pomocí návrháře tabulek SSMS nebo editoru tabulek dbForge Studio pro SQL Server.
Všimněte si, že ALTER TABLE vyžaduje opětovné sestavení tabulky. Proto se před spuštěním této operace musíte ujistit, že máte dostatek paměti. Během operace opětovného sestavení je každý jednotlivý řádek znovu vložen do nové tabulky a tabulka není dostupná, když se provádí operace ALTER.
Do jedné tabulky můžete zavést více změn a zkombinovat je do jediného příkazu ALTER TABLE. Můžete PŘIDÁVAT sloupce, indexy a omezení a můžete sloupce, indexy a omezení ODEJÍT. Všimněte si, že nemůžete kombinovat příkazy ADD a DROP dohromady v jedné ALTER TABLE.
-- index operations -- change hash index bucket count ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072); GO -- add index ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName); GO -- drop index ALTER TABLE dbo.TableName DROP INDEX IX_Name; GO -- add multiple indexes ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName), INDEX IX_Name2 NONCLUSTERED (ColName2); GO -- Add a new column and an index ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName); GO -- Drop a column ALTER TABLE dbo.TableName DROP COLUMN ColName; GO
Typy tabulek a proměnné tabulek
SQL Server 2016 vám poskytuje možnost vytvářet typy tabulek optimalizované pro paměť, které můžete použít při definování proměnné tabulky:
CREATE TYPE TypeName AS TABLE ( Col1 SMALLINT NOT NULL, Col2 INT NOT NULL, Col3 INT NOT NULL, Col4 INT NOT NULL, INDEX IX_Col1 NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 131072), INDEX IX_Col1 NONCLUSTERED (Col2)) WITH (MEMORY_OPTIMIZED = ON); GO DECLARE @VariableName TypeName; GO
Tato proměnná je uložena pouze v paměti. Tabulky a typy tabulek optimalizované v paměti používají stejné datové struktury, takže přístup k datům bude efektivnější ve srovnání s proměnnými tabulek na disku.
Další podrobnosti naleznete v následujícím příspěvku na blogu MSDN:Zlepšení výkonu dočasné tabulky a proměnné tabulky pomocí optimalizace paměti
Shrnutí
In-Memory OLTP je relativně mladá technologie, která je navržena pro práci s obrovskými a velmi vytíženými systémy OLTP, které podporují stovky nebo dokonce tisíce souběžných uživatelů. Byla představena v SQL Server 2014 a vyvinuta v SQL Server 2016.
Zároveň tato technologie obsahuje řadu omezení a omezení.
Ne všechny funkce a datové typy T-SQL podporované pamětí- optimalizované tabulky, takové tabulky nemohou obsahovat řádky, které přesahují 8060 bajtů, a také nepodporují
ROW-OVERFLOW a LOB úložiště. Jakmile je tabulka vytvořena, nemůžete měnit tabulky a indexy (v SQL Server 2014).
Navzdory tomu očekáváme, že další verze In-Memory OLTP budou mít méně omezení!
Přečtěte si také:
Použití indexů v tabulkách s optimalizovanou pamětí serveru SQL