Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
In-Memory OLTP zavádí koncept nativní kompilace. SQL Server může nativně kompilovat uložené procedury, které přistupují k tabulkám optimalizovaným pro paměť. SQL Server také dokáže nativně kompilovat tabulky optimalizované pro paměť. Nativní kompilace umožňuje rychlejší přístup k datům a efektivnější spouštění dotazů než interpretované (tradiční) transact-SQL. Nativní kompilace tabulek a uložených procedur vytváří knihovny DLL.
Podporuje se také nativní kompilace typů tabulek optimalizovaných pro paměť. Další informace naleznete v tématu Rychlejší dočasná tabulka a tabulková proměnná s využitím optimalizace paměti.
Nativní kompilace odkazuje na proces převodu programovacích konstruktorů na nativní kód, který se skládá z instrukcí procesoru bez nutnosti další kompilace nebo interpretace.
In-Memory OLTP kompiluje tabulky optimalizované pro paměť při jejich vytváření a nativně kompilované uložené procedury při jejich načtení do nativních knihoven DLL. Knihovny DLL se navíc po restartování databáze nebo serveru znovu kompilují. Informace potřebné k opětovnému vytvoření knihoven DLL jsou uloženy v metadatech databáze. Knihovny DLL nejsou součástí databáze, i když jsou přidružené k databázi. Například knihovny DLL nejsou zahrnuty do záloh databáze.
Poznámka:
Tabulky optimalizované pro paměť se během restartování serveru znovu kompilují. Aby se urychlilo obnovení databáze, nativně zkompilované uložené procedury se během restartování serveru nekompilují, zkompilují se při prvním spuštění. V důsledku této odložené kompilace se nativně zkompilované uložené procedury zobrazí pouze při volání sys.dm_os_loaded_modules (Transact-SQL) po prvním spuštění.
Údržba dynamických knihoven In-Memory OLTP
Na serveru jsou aktuálně v paměti načteny DLL knihovny pro tabulky a uložené procedury; následující dotaz je zobrazí všechny:
SELECT
mod1.name,
mod1.description
from
sys.dm_os_loaded_modules as mod1
where
mod1.description = 'XTP Native DLL';
Správci databáze nemusí udržovat soubory, které jsou generovány nativní kompilací. SQL Server automaticky odebere vygenerované soubory, které už nejsou potřeba. Například vygenerované soubory budou odstraněny při odstranění tabulky a uložené procedury nebo při vyřazení databáze.
Poznámka:
Pokud kompilace selže nebo je přerušena, některé vygenerované soubory se neodeberou. Tyto soubory jsou záměrně ponechány kvůli podpoře a při vyřazení databáze se odeberou.
Poznámka:
SQL Server zkompiluje knihovny DLL pro všechny tabulky potřebné pro obnovení databáze. Pokud byla tabulka ukončena těsně před restartováním databáze, mohou být v souborech kontrolních bodů nebo transakčním protokolu stále zbytky tabulky, aby knihovna DLL pro tabulku mohla být při spuštění databáze znovu zkompilována. Po restartování bude knihovna DLL uvolněna a soubory budou odebrány běžným procesem čištění.
Nativní kompilace tabulek
Vytvoření tabulky optimalizované pro paměť pomocí příkazu CREATE TABLE vede k zápisu informací o tabulce do metadat databáze a struktur tabulek a indexů vytvořených v paměti. Tabulka bude také zkompilována do knihovny DLL.
Představte si následující ukázkový skript, který vytvoří databázi a tabulku optimalizovanou pro paměť:
USE master;
GO
CREATE DATABASE DbMemopt3;
GO
ALTER DATABASE DbMemopt3
add filegroup DbMemopt3_mod_memopt_1_fg
contains memory_optimized_data
;
GO
-- You must edit the front portion of filename= path, to where your DATA\ subdirectory is,
-- keeping only the trailing portion '\DATA\DbMemopt3_mod_memopt_1_fn'!
ALTER DATABASE DbMemopt3
add file
(
name = 'DbMemopt3_mod_memopt_1_name',
filename = 'C:\DATA\DbMemopt3_mod_memopt_1_fn'
--filename = 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSVR2016ID\MSSQL\DATA\DbMemopt3_mod_memopt_1_fn'
)
to filegroup DbMemopt3_mod_memopt_1_fg
;
GO
USE DbMemopt3;
GO
CREATE TABLE dbo.t1
(
c1 int not null primary key nonclustered,
c2 int
)
with (memory_optimized = on)
;
GO
-- You can safely rerun from here to the end.
-- Retrieve the path of the DLL for table t1.
DECLARE @moduleName nvarchar(256);
SET @moduleName =
(
'%xtp_t_' +
cast(db_id() as nvarchar(16)) +
'_' +
cast(object_id('dbo.t1') as nvarchar(16)) +
'%.dll'
)
;
-- SEARCHED FOR NAME EXAMPLE: mod1.name LIKE '%xtp_t_8_565577053%.dll'
PRINT @moduleName;
SELECT
mod1.name,
mod1.description
from
sys.dm_os_loaded_modules as mod1
where
mod1.name LIKE @moduleName
order by
mod1.name
;
-- ACTUAL NAME EXAMPLE: mod1.name = 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSVR2016ID\MSSQL\DATA\xtp\8\xtp_t_8_565577053_184009305855461.dll'
GO
-- DROP DATABASE DbMemopt3; -- Clean up.
GO
Vytvoření tabulky rovněž vytvoří související knihovnu DLL a načte tuto knihovnu do paměti. Dotaz DMV okamžitě po příkazu CREATE TABLE načte cestu k DLL souboru tabulky.
Knihovna DLL rozumí strukturám indexu a formátu řádku tabulky. SQL Server používá knihovnu DLL pro procházení indexů, načítání řádků a ukládání obsahu řádků.
Nativní kompilace uložených procedur
Uložené procedury označené NATIVE_COMPILATION se nativně kompilují. To znamená, že příkazy Transact-SQL v postupu jsou všechny zkompilovány do nativního kódu pro efektivní provádění obchodní logiky kritické pro výkon.
Další informace o nativně kompilovaných uložených procedurách naleznete v tématu Nativní kompilace uložených procedur.
Představte si následující ukázkovou uloženou proceduru, která vloží řádky do tabulky t1 z předchozího příkladu:
CREATE PROCEDURE dbo.native_sp
with native_compilation,
schemabinding,
execute as owner
as
begin atomic
with (transaction isolation level = snapshot,
language = N'us_english')
DECLARE @i int = 1000000;
WHILE @i > 0
begin
INSERT dbo.t1 values (@i, @i+1);
SET @i -= 1;
end
end;
GO
EXECUTE dbo.native_sp;
GO
-- Reset.
DELETE from dbo.t1;
GO
Knihovna DLL pro native_sp může interagovat přímo s knihovnou DLL pro t1, stejně jako s In-Memory modulem úložiště OLTP, aby vložil řádky co nejrychleji.
Kompilátor OLTP In-Memory využívá optimalizátor dotazů k vytvoření efektivního plánu provádění pro každý z dotazů v uložené proceduře. Mějte na paměti, že nativně kompilované uložené procedury nejsou automaticky rekompilovány, pokud se data v tabulce změní. Další informace o udržování statistik a uložených procedur pomocí In-Memory OLTP naleznete v tématu Statistika pro tabulky Memory-Optimized.
Důležité informace o zabezpečení pro nativní kompilaci
Nativní kompilace tabulek a uložených procedur používá kompilátor In-Memory OLTP. Tento kompilátor vytváří soubory, které jsou zapsány na disk a načteny do paměti. SQL Server používá následující mechanismy k omezení přístupu k těmto souborům.
Nativní kompilátor
Spustitelný soubor kompilátoru i binární soubory a soubory hlaviček vyžadované pro nativní kompilaci se instalují jako součást instance SQL Serveru ve složce MSSQL\Binn\Xtp. Takže pokud je výchozí instance nainstalována v C:\Program Files, jsou soubory kompilátoru nainstalovány v C:\Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\Binn\Xtp.
K omezení přístupu k kompilátoru používá SQL Server seznamy řízení přístupu (ACL) k omezení přístupu k binárním souborům. Všechny binární soubory SQL Serveru jsou chráněné proti úpravám nebo manipulaci prostřednictvím seznamů ACL. Seznamy ACL nativního kompilátoru také omezují použití kompilátoru; Oprávnění ke čtení a spouštění nativních souborů kompilátoru mají pouze účet služby SQL Serveru a správci systému.
Soubory generované nativní kompilací
Soubory vytvořené při kompilaci tabulky nebo uložené procedury zahrnují knihovny DLL a zprostředkující soubory včetně souborů s následujícími příponami: .c, .obj, .xmla .pdb. Vygenerované soubory se ukládají do podsložky výchozí datové složky. Podsložka se nazývá Xtp. Při instalaci výchozí instance s výchozí datovou složkou se vygenerované soubory umístí do složky C:\Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\DATA\Xtp.
SQL Server zabraňuje manipulaci s vygenerovanými knihovny DLL třemi způsoby:
Pokud je tabulka nebo uložená procedura zkompilována do knihovny DLL, tato knihovna DLL je okamžitě načtena do paměti a propojena s procesem sqlserver.exe. Knihovnu DLL nelze změnit, pokud je propojena s procesem.
Při restartování databáze se všechny tabulky a uložené procedury znovu kompilují (odeberou a znovu vytvoří) na základě metadat databáze. Tím se odeberou všechny změny vygenerovanému souboru agentem se zlými úmysly.
Vygenerované soubory jsou považovány za součást uživatelských dat a mají stejná omezení zabezpečení prostřednictvím seznamů ACL jako databázové soubory: k těmto souborům mají přístup pouze účet služby SQL Serveru a správci systému.
Ke správě těchto souborů není potřeba žádná interakce uživatele. SQL Server podle potřeby vytvoří a odebere soubory.