Průzkum počátečních oblastí v In-Memory OLTP
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Tento článek je určený pro vývojáře, který spěchá, aby se seznámil se základy funkcí výkonu OLTP systému Microsoft SQL Server a Azure SQL Database In-Memory.
Pro In-Memory OLTP najdete v tomto článku:
- Rychlé vysvětlení funkcí
- Základní ukázky kódu, které implementují funkce
SQL Server a SQL Database mají pouze menší variace v jejich podpoře In-Memory technologií.
Někteří bloggeři na internetu odkazují na In-Memory OLTP jako Hekaton.
Výhody funkcí In-Memory
SQL Server poskytuje In-Memory funkce, které můžou výrazně zlepšit výkon mnoha aplikačních systémů. Nejpřímější aspekty jsou popsány v této části.
Funkce pro OLTP (online transakční zpracování)
Systémy, které musí současně zpracovávat velký počet SQL INSERT, jsou vynikajícími kandidáty pro funkce OLTP.
- Naše srovnávací testy ukazují, že zrychlení z 5krát na 20krát rychlejší je dosažitelné přijetím funkcí In-Memory.
Systémy, které zpracovávají náročné výpočty v Transact-SQL jsou vynikajícími kandidáty.
- Uložená procedura vyhrazená pro náročné výpočty může běžet až 99krát rychleji.
Později můžete navštívit následující články, které nabízejí ukázky zvýšení výkonu z In-Memory OLTP:
- Demonstrace: Zlepšení výkonu In-Memory OLTP nabízí malou demonstraci většího potenciálního zvýšení výkonu.
- ukázková databáze pro In-Memory OLTP nabízí větší ukázku.
Funkce pro provozní analýzy
In-Memory Analytics odkazuje na funkce SQL SELECT, které agregují transakční data, obvykle zahrnutím klauzule GROUP BY. Typ indexu s názvem columnstore je centrální pro provozní analýzu.
Existují dva hlavní scénáře:
-
služba Batch Operational Analytics odkazuje na agregační procesy, které běží buď po pracovní době, nebo na sekundárním hardwaru, který obsahuje kopie transakčních dat.
- azure Synapse Analytics souvisí také s dávkovou provozní analýzou.
- provozní analýzy v reálném čase odkazuje na agregační procesy, které běží během pracovní doby a na primárním hardwaru, který se používá pro transakční úlohy.
Tento článek se zaměřuje na OLTP a ne na analýzy. Informace o tom, jak indexy columnstore přinášejí Analytics do SQL, najdete tady:
- Začínáme s Columnstorem pro provozní analýzy v reálném čase
- Průvodce indexy columnstore
Columnstore
Řada vynikajících blogových příspěvků elegantně vysvětluje indexy columnstore z různých úhlů pohledu. Většina příspěvků popisuje podrobněji koncept provozní analýzy v reálném čase, který columnstore podporuje. Tyto příspěvky vytvořil Sunil Agarwal, programový manažer v Microsoftu v březnu 2016.
Provozní analýza v reálném čase
- Real-Time operační analytika pomocí technologie In-Memory
- Real-Time Operational Analytics – přehled nevázaného columnstore indexu (NCCI)
- Real-Time Operational Analytics: Jednoduchý příklad použití neclusterovaného clusterovaného indexu columnstore (NCCI) v SQL Serveru 2016
- Real-Time Operational Analytics: Operace DML a neklastrovaný index columnstore (NCCI) v SQL Serveru 2016
- Real-Time Operační analýza: Filtrovaný neklastrovaný columnstore index (NCCI)
- Real-Time Provozní analýzy: Volba zpoždění komprese pro neklastrový columnstore index (NCCI)
- Real-Time Operativní analýzy: Možnost zpoždění komprese s NCCI a výkon
- Real-Time Operational Analytics: Memory-Optimized tabulky a sloupcové indexy
Defragmentace indexu columnstore
- defragmentace indexu Columnstore pomocí příkazu REORGANIZE
- Zásady sloučení Columnstore indexu pro reorganizaci
Hromadný dovoz údajů
- Sloupcově strukturované clusterované úložiště: Hromadné načítání
- Seskupený index sloupcového úložiště: Optimalizace načítání dat – Minimální protokolování
- clusterovaný index columnstore: Optimalizace načítání dat – paralelní hromadný import
Funkce In-Memory OLTP
Podívejme se na hlavní funkce In-Memory OLTP.
Tabulky optimalizované pro paměť
Klíčové slovo T-SQL MEMORY_OPTIMIZED v příkazu CREATE TABLE je způsob vytvoření tabulky, která bude existovat v aktivní paměti místo na disku.
Tabulka optimalizovaná pro paměť má jednu svoji reprezentaci v aktivní paměti a sekundární kopii na disku.
- Kopírování disku slouží k rutinní obnově po vypnutí serveru nebo databáze. Tato duální paměť plus-disk je zcela skrytá od vás a vašeho kódu.
Nativní kompilované moduly
Klíčové slovo T-SQL NATIVE_COMPILATION v příkazu CREATE PROCEDURE je způsob vytvoření nativně zkompilované uložené procedury. Příkazy T-SQL se kompilují do strojového kódu při prvním použití nativního proc při každém cyklu databáze online. Instrukce T-SQL už nevydržují pomalé interpretace všech instrukcí.
- Viděli jsme, že výsledkem nativní kompilace je doba trvání, která je jedna setina interpretované doby trvání.
Nativní modul může odkazovat pouze na tabulky optimalizované pro paměť a nemůže odkazovat na tabulky založené na disku.
Existují tři typy nativně kompilovaných modulů:
- nativně kompilované uložené procedury.
- Nativně kompilované uživatelem definované funkce (UDF), které jsou skalární.
- Nativně zkompilované triggery.
Dostupnost ve službě Azure SQL Database
In-Memory OLTP a Columnstore jsou k dispozici ve službě Azure SQL Database. Podrobnosti najdete v tématu Optimalizace výkonu pomocí technologií In-Memory ve službě SQL Database.
1. Zajistěte úroveň kompatibility >= 130
Tato část začíná posloupnost číslovaných oddílů, které společně ukazují syntaxi Transact-SQL, kterou můžete použít k implementaci In-Memory funkcí OLTP.
Za prvé je důležité nastavit databázi na úroveň kompatibility minimálně 130. Dále je kód T-SQL pro zobrazení aktuální úrovně kompatibility, na kterou je aktuální databáze nastavená.
SELECT d.compatibility_level
FROM sys.databases as d
WHERE d.name = Db_Name();
Dále je kód T-SQL, který v případě potřeby aktualizuje úroveň.
ALTER DATABASE CURRENT
SET COMPATIBILITY_LEVEL = 130;
2. Aktualizace na SNAPSHOT
Pokud transakce zahrnuje tabulku založenou na disku i tabulku optimalizovanou pro paměť, nazýváme transakce mezi kontejnery. V takové transakci je nezbytné, aby část transakce optimalizovaná pro paměť fungovala na úrovni izolace transakce s názvem SNAPSHOT.
Pokud chcete tuto úroveň spolehlivě vynutit pro tabulky optimalizované pro paměť v transakci mezi systémy, změňte nastavení databáze spuštěním následujícího skriptu T-SQL.
ALTER DATABASE CURRENT
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
3. Vytvořit optimalizovanou souborovou skupinu
Než budete moci vytvořit tabulku optimalizovanou pro paměť v Microsoft SQL Serveru, musíte nejprve vytvořit FILEGROUP, který deklarujete jako CONTAINS MEMORY_OPTIMIZED_DATA. K vaší databázi je přiřazená skupina FILEGROUP. Podrobnosti najdete tady:
Ve službě Azure SQL Database nemusíte a nemůžete takovou skupinu FILEGROUP vytvořit.
Následující ukázkový skript T-SQL umožňuje databázi pro In-Memory OLTP a nakonfiguruje všechna doporučená nastavení. Funguje s SQL Serverem i službou Azure SQL Database: enable-in-memory-oltp.sql.
Všimněte si, že databáze s MEMORY_OPTIMIZED_DATA skupinami souborů nepodporují všechny funkce SQL Serveru. Podrobnosti o omezeních najdete v tématu: Nepodporované funkce SQL Serveru pro In-Memory OLTP
4. Vytvoření tabulky optimalizované pro paměť
Klíčové slovo Transact-SQL je MEMORY_OPTIMIZED.
CREATE TABLE dbo.SalesOrder
(
SalesOrderId integer not null IDENTITY
PRIMARY KEY NONCLUSTERED,
CustomerId integer not null,
OrderDate datetime not null
)
WITH
(MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_AND_DATA);
Transact-SQL příkazy INSERT a SELECT pro tabulku optimalizovanou pro paměť jsou stejné jako u běžné tabulky.
ALTER TABLE pro tabulky Memory-Optimized
ALTER TABLE... ADD/DROP může přidat nebo odebrat sloupec z paměťově optimalizované tabulky nebo indexu.
- Příkazy CREATE INDEX a DROP INDEX nelze spustit pro tabulku optimalizovanou pro paměť, místo toho použijte ALTER TABLE ... ADD/DROP INDEX.
- Podrobnosti viz Změna Memory-Optimized Tabulek.
Plánování tabulek a indexů optimalizovaných pro paměť
- Indexy pro tabulky Memory-Optimized
- Transact-SQL Konstrukce, které In-Memory OLTP nepodporuje
5. Vytvořte nativně zkompilovanou uloženou proceduru (nativní proc)
Klíčové klíčové slovo je NATIVE_COMPILATION.
CREATE PROCEDURE ncspRetrieveLatestSalesOrderIdForCustomerId
@_CustomerId INT
WITH
NATIVE_COMPILATION,
SCHEMABINDING
AS
BEGIN ATOMIC
WITH
(TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'us_english')
DECLARE @SalesOrderId int, @OrderDate datetime;
SELECT TOP 1
@SalesOrderId = s.SalesOrderId,
@OrderDate = s.OrderDate
FROM dbo.SalesOrder AS s
WHERE s.CustomerId = @_CustomerId
ORDER BY s.OrderDate DESC;
RETURN @SalesOrderId;
END;
Klíčové slovo SCHEMABINDING znamená, že tabulky odkazované v nativní proceduře nelze odstranit, pokud se nejprve neodstraní samotná nativní procedura. Podrobnosti najdete v tématu Vytváření nativně kompilovaných uložených procedur.
Všimněte si, že pro přístup k tabulce optimalizované pro paměť nemusíte vytvářet nativně zkompilovanou uloženou proceduru. Můžete také odkazovat na tabulky optimalizované pro paměť z tradičních uložených procedur a ad hoc dávkových úloh.
6. Spusťte nativní proc.
Naplňte tabulku dvěma řádky dat.
INSERT into dbo.SalesOrder
( CustomerId, OrderDate )
VALUES
( 42, '2013-01-13 03:35:59' ),
( 42, '2015-01-15 15:35:59' );
Volání EXECUTE pro nativně zkompilovanou uloženou proceduru následuje.
DECLARE @LatestSalesOrderId int, @mesg nvarchar(128);
EXECUTE @LatestSalesOrderId =
ncspRetrieveLatestSalesOrderIdForCustomerId 42;
SET @mesg = CONCAT(@LatestSalesOrderId,
' = Latest SalesOrderId, for CustomerId = ', 42);
PRINT @mesg;
Tady je skutečný výstup PRINT:
-- 2 = Latest SalesOrderId, for CustomerId = 42
Průvodce dokumentací a dalšími kroky
Předchozí jednoduché příklady vám poskytnou základ pro seznámení s pokročilejšími funkcemi In-Memory OLTP. Následující části jsou vodítkem pro zvláštní aspekty, které byste možná potřebovali znát, a kde najdete podrobnosti o jednotlivých částech.
Jak In-Memory funkce OLTP fungují mnohem rychleji
Následující pododdíly stručně popisují, jak fungují funkce OLTP In-Memory interně za účelem zajištění lepšího výkonu.
Jak fungují tabulky optimalizované pro paměť rychleji
Dvojí povaha: Tabulka optimalizovaná pro paměť má dvojí povahu: jednu reprezentaci v aktivní paměti a druhou na pevném disku. Každá transakce je potvrzena na obě reprezentace tabulky. Transakce pracují s mnohem rychlejší reprezentací aktivní paměti. Tabulky optimalizované pro paměť využívají větší rychlost aktivní paměti oproti disku. Dále, větší svižnost aktivní paměti umožňuje praktické použití pokročilejší struktury tabulky, která je optimalizovaná pro rychlost. Pokročilá struktura je také bez stránek, takže zabraňuje zatížení a kolizím se západkami a spinlocky.
Žádné zámky: Tabulka optimalizovaná pro paměť spoléhá na optimistický přístup ke konkurenčním cílům integrity dat a souběžnosti a vysoké propustnosti. Během transakce tabulka neumisťuje zámky na žádnou verzi aktualizovaných řádků dat. To může výrazně snížit konflikty v některých systémech s vysokým objemem.
verze řádků: Namísto zámků přidá tabulka optimalizovaná pro paměť novou verzi aktualizovaného řádku v samotné tabulce, ne v databázi tempdb. Původní řádek se uchovává až do potvrzení transakce. Během transakce mohou ostatní procesy číst původní verzi řádku.
- Při vytváření více verzí řádku pro tabulku založenou na disku se verze řádků dočasně ukládají v databázi tempdb.
Méně protokolování: V tabulce optimalizované pro paměť se uchovávají verze aktualizovaných řádků před a po. Dvojice řádků poskytuje většinu informací, které jsou tradičně zapsány do souboru protokolu. To umožňuje systému psát méně informací a méně často do protokolu. Přesto je zajištěna transakční integrita.
Jak nativní počítače fungují rychleji
Převod běžné interpretované uložené procedury na nativně zkompilovanou uloženou proceduru výrazně snižuje počet instrukcí, které se mají spustit během běhu.
Kompromisy In-Memory funkcí
Stejně jako u počítačových věd jsou zvýšení výkonu poskytované funkcemi In-Memory kompromisem. Lepší funkce přinášejí výhody, které jsou cennější než dodatečné náklady na tuto funkci. Komplexní pokyny týkající se kompromisů najdete v následujících tématu:
Zbytek této části uvádí některé hlavní aspekty plánování a kompromisů.
Kompromisy tabulek optimalizovaných pro paměť
Odhad paměti: Musíte odhadnout množství aktivní paměti, kterou bude tabulka optimalizovaná pro paměť spotřebovávat. Váš počítačový systém musí mít dostatečnou kapacitu paměti pro hostování tabulky optimalizované pro paměť. Podrobnosti najdete tady:
- Monitorování a řešení potíží s využitím paměti
- Odhad požadavků na paměť pro tabulky Memory-Optimized
- velikost tabulky a řádku v tabulkách Memory-Optimized
Rozdělit velkou tabulku: Jedním ze způsobů, jak splnit poptávku po velké části aktivní paměti, je rozdělit velkou tabulku do částí v paměti, které ukládají horké nedávné řádky dat a jiné části na disku, které ukládají studené starší řádky (například prodejní objednávky, které byly plně dodány a dokončeny). Toto dělení je ruční proces návrhu a implementace. Viz:
Kompromisy nativních procesů
- Nativně zkompilovaná uložená procedura nemá přístup k tabulce založené na disku. Nativní proc má přístup pouze k tabulkám optimalizovaným pro paměť.
- Když se nativní proc spustí poprvé poté, co byl server nebo databáze naposledy vrácena do režimu online, musí se nativní proc jednou znovu zkompilovat. To způsobí zpoždění před spuštěním nativního proc.
Pokročilé aspekty tabulek optimalizovaných pro paměť
Indexy pro Memory-Optimized tabulky se v některých ohledech liší od indexů u tradičních tabulek uložených na disku. Indexy hash jsou k dispozici pouze v tabulkách optimalizovaných pro paměť.
Musíte naplánovat, aby byla pro vaši tabulku optimalizovanou pro plánovanou paměť a její indexy dostatek aktivní paměti. Viz:
Tabulku optimalizovanou pro paměť lze deklarovat pomocí DURABILITY = SCHEMA_ONLY:
- Tato syntaxe systému říká, aby při offline režimu databáze zahodila všechna data z tabulky optimalizované pro paměť. Zachová se pouze definice tabulky.
- Při návratu databáze do režimu online se tabulka optimalizovaná pro paměť načte zpět do aktivní paměti, která je prázdná.
- SCHEMA_ONLY tabulky můžou být vynikající alternativou k #temporary tabulkám v databázi tempdb, když je zapojeno mnoho tisíců řádků.
Proměnné tabulky lze také deklarovat jako optimalizované pro paměť. Viz:
Pokročilé aspekty nativních kompilovaných modulů
Typy nativně kompilovaných modulů dostupné prostřednictvím Transact-SQL jsou:
- Nativně zkompilované uložené procedury (nativní procedury).
- Uživatelsky definované skalární funkce nativně kompilované .
- Nativně kompilované spouštěče (nativní spouštěče).
- V tabulkách optimalizovaných pro paměť jsou povoleny pouze triggery, které jsou nativně kompilovány.
- Nativně kompilované tabulkové funkce .
Nativně zkompilovaná uživatelem definovaná funkce (UDF) běží rychleji než interpretovaná funkce definovaná uživatelem. Zde je několik úvah o uživatelsky definovaných funkcích:
- Pokud výraz T-SQL SELECT používá uživatelsky definovanou funkci (UDF), je tato funkce vždy volána jednou za každý vrácený řádek.
- Funkce definované uživatelem (UDF) nikdy neběží v řádku a místo toho vždy jsou volány.
- Kompilovaný rozdíl je méně významný, než je režie opakovaných volání, která jsou nedílnou součástí všech funkcí definovaných uživatelem.
- Režijní náklady na volání UDF jsou ale často přijatelné v praktické rovině.
Testovací data a vysvětlení výkonu nativních funkcí definovaných uživatelem najdete tady:
Průvodce dokumentací pro tabulky optimalizované pro paměť
Projděte si tyto další články, které se týkají zvláštních aspektů pro tabulky optimalizované pro paměť:
-
Migrace na In-Memory OLTP
- Určení, jestli má být tabulka nebo uložená procedura portována do In-Memory OLTP
- Sestava analýzy výkonu transakcí v aplikaci SQL Server Management Studio vám pomůže vyhodnotit, jestli In-Memory OLTP zlepší výkon vaší databázové aplikace.
- Pomocí nástroje Memory Optimization Advisor vám pomůže migrovat tabulku databáze založené na disku do In-Memory OLTP.
-
zálohování, obnovení a obnovení tabulek Memory-Optimized
- Úložiště používané tabulkami optimalizovanými pro paměť může být mnohem větší než jeho velikost v paměti a ovlivňuje velikost zálohy databáze.
-
Transakce s Memory-Optimized tabulkami
- Obsahuje informace o logice opakování v T-SQL pro transakce v tabulkách optimalizovaných pro paměť.
- Podpora Transact-SQL In-Memory pro OLTP
- Podporované a nepodporované T-SQL typy a datové typy pro tabulky optimalizované pro paměť a nativní procedury.
- Vytvořit vazbu databáze, která obsahuje tabulky Memory-Optimized, na fond zdrojů, kde se probírají volitelné pokročilé úvahy.
Průvodce dokumentací pro nativní procesy
Následující článek a podřízené položky v obsahu (TOC) vysvětlují podrobnosti o nativně zkompilovaných uložených procedurách.
Související odkazy
- Počáteční článek: In-Memory OLTP (In-Memory optimalizace)
Tady jsou články, které nabízejí kód, který ukazuje zvýšení výkonu, kterého můžete dosáhnout pomocí In-Memory OLTP:
- ukázka: Zlepšení výkonu In-Memory OLTP nabízí malou ukázku většího možného zvýšení výkonu.
- ukázková databáze pro In-Memory OLTP nabízí větší ukázku.