Sdílet prostřednictvím


Nativní kompilace tabulek a uložených procedur

platí pro: SQL Server Azure SQL DatabaseAzure 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.

Viz také

tabulkyMemory-Optimized

Nativně zkompilované uložené procedury