Native Kompilierung von Tabellen und gespeicherten Prozeduren

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Mit In-Memory OLTP wird das Konzept der systeminternen Kompilierung eingeführt. SQL Server kann gespeicherte Prozeduren nativ kompilieren, die auf speicheroptimierte Tabellen zugreifen. SQL Server kann auch speicheroptimierte Tabellen nativ kompilieren. Die systemeigene Kompilierung ermöglicht schnelleren Datenzugriff und effizientere Abfrageausführung als interpretierte (herkömmliche) Transact-SQL. Beim systeminternen Kompilieren von Tabellen und gespeicherten Prozeduren werden DLLs erzeugt.

Die systeminterne Kompilierung von speicheroptimierten Tabellentypen wird ebenfalls unterstützt. Weitere Informationen finden Sie unter Schnellere temporäre Tabellen und Tabellenvariablen durch Speicheroptimierung.

Systeminterne Kompilierung bezieht sich auf den Prozess der Konvertierung von Programmkonstrukten in systemeigenen Code, der aus Prozessoranweisungen besteht, die keine weitere Kompilierung oder Interpretation erfordern.

In-Memory OLTP kompiliert speicheroptimierte Tabellen bei deren Erstellung sowie systemintern kompilierte gespeicherte Prozeduren beim Laden in systemeigene DLLs. Außerdem werden die DLLs nach einem Datenbank- oder Serverneustart neu kompiliert. Die zum erneuten Erstellen der DLLs erforderlichen Informationen werden in den Datenbankmetadaten gespeichert. Die DLLs sind nicht Teil der Datenbank, sie sind der Datenbank aber zugeordnet. Beispielsweise sind die DLLs nicht in den Datenbanksicherungen enthalten.

Hinweis

Speicheroptimierte Tabellen werden beim jedem Serverneustart neu kompiliert. Um die Datenbankwiederherstellung zu beschleunigen, werden systemintern kompilierte gespeicherte Prozeduren beim Serverneustart nicht neu kompiliert. Sie werden stattdessen bei der ersten Ausführung kompiliert. Aufgrund dieser verzögerten Kompilierung werden nativ kompilierte gespeicherte Prozeduren nur angezeigt, wenn nach der ersten Ausführung sys.dm_os_loaded_modules (Transact-SQL) aufgerufen wird.

Wartung von In-Memory OLTP-DLLs

Die folgende Abfrage zeigt alle DLLs für Tabellen und gespeicherte Prozeduren, die aktuell in den Arbeitsspeicher des Servers geladen sind:

SELECT
		mod1.name,
		mod1.description
	from
		sys.dm_os_loaded_modules  as mod1
	where
		mod1.description = 'XTP Native DLL';

Datenbankadministratoren müssen die Dateien, die von der systeminterne Kompilierung erstellt werden, nicht manuell pflegen. SQL Server entfernt automatisch generierte Dateien, die nicht mehr benötigt werden. Beispielsweise werden generierte Dateien gelöscht, wenn eine Tabelle und eine gespeicherte Prozedur gelöscht werden, oder wenn eine Datenbank gelöscht wird.

Hinweis

Wenn Kompilierung fehlschlägt oder unterbrochen wird, werden einige generierte Dateien nicht entfernt. Diese Dateien werden absichtlich beibehalten, um die Unterstützbarkeit zu gewährleisten. Sie werden beim Löschen der Datenbank entfernt.

Hinweis

SQL Server kompiliert die DLLs für alle Tabellen, die für die Datenbankwiederherstellung erforderlich sind. Wenn eine Tabelle unmittelbar vor einem Neustart der Datenbank gelöscht wurde, können immer noch Reste der Tabelle in den Prüfpunktdateien oder dem Transaktionsprotokoll vorhanden sein, sodass die DLL für die Tabelle beim Datenbankstart neu kompiliert werden kann. Nach dem Neustart wird die DLL entladen, und die Dateien durch den normalen Bereigungsprozess entfernt.

Systeminterne Kompilierung von Tabellen

Beim Erstellen einer speicheroptimierten Tabelle mithilfe der CREATE TABLE -Anweisung werden die Tabelleninformationen in die Datenbankmetadaten geschrieben und die Tabellen- und Indexstrukturen im Arbeitsspeicher erstellt. Die Tabelle wird außerdem zu einer DLL kompiliert.

Betrachten Sie das folgende Beispielskript, in dem eine Datenbank und eine speicheroptimierte Tabelle erstellt werden:

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

Durch das Erstellen der Tabelle wird auch die Tabellen-DLL erstellt und in den Arbeitsspeicher geladen. Die DMV-Abfrage unmittelbar nach der CREATE TABLE-Anweisung ruft den Pfad der Tabellen-DLL ab.

Die Tabellen-DLL kann die Indexstrukturen und das Zeilenformat der Tabelle lesen. SQL Server verwendet die DLL zum Durchlaufen von Indizes, zum Abrufen von Zeilen sowie zum Speichern des Inhalts der Zeilen.

Systeminterne Kompilierung gespeicherter Prozeduren

Gespeicherte Prozeduren, die mit NATIVE_COMPILATION markiert sind, werden systemintern kompiliert. Dies bedeutet, dass die Transact-SQL-Anweisungen in der Prozedur zur effizienten Ausführung leistungskritischer Geschäftslogik in systemeigenem Code kompiliert werden.

Weitere Informationen zu systemintern kompilierten gespeicherten Prozeduren finden Sie unter Natively Compiled Stored Procedures.

Betrachten Sie das folgende Beispiel für eine gespeicherte Prozedur, die Zeilen in die Tabelle t1 aus dem vorherigen Beispiel einfügt:

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

Die DLL für native_sp kann direkt mit der DLL für t1 sowie mit der Speicher-Engine von In-Memory-OLTP interagieren, sodass Zeilen in der kürzestmöglichen Zeit eingefügt werden können.

Der Compiler von In-Memory OLTP nutzt den Abfrageoptimierer, um einen effizienten Ausführungsplan für die einzelnen Abfragen in der gespeicherten Prozedur zu erstellen. Beachten Sie, dass systemintern kompilierte gespeicherte Prozeduren nicht automatisch neu kompiliert werden, wenn sich die Daten in der Tabelle ändern. Weitere Informationen zur Verwaltung von Statistiken und gespeicherten Prozeduren mit In-Memory-OLTP finden Sie unter Statistiken für speicheroptimierte Tabellen.

Sicherheitsüberlegungen für systeminterne Kompilierung

Die systeminterne Kompilierung von Tabellen und gespeicherten Prozeduren verwendet den In-Memory OLTP-Compiler. Dieser Compiler erzeugt Dateien, die auf den Datenträger geschrieben und in den Arbeitsspeicher geladen werden. SQL Server verwendet die folgenden Mechanismen, um den Zugriff auf diese Dateien einzuschränken.

Systemeigener Compiler

Die ausführbare Compilerdatei sowie Binärdateien und Headerdateien, die für die native Kompilierung erforderlich sind, werden als Teil der SQL Server-Instanz unter dem Ordner MSSQL\Binn\Xtp installiert. Wenn die Standardinstanz also unter "C:\Program Files" installiert ist, werden die Compilerdateien in C:\Program Files\Microsoft SQL Server\MSSQL13 installiert. MSSQLSERVER\MSSQL\Binn\Xtp.

Um den Zugriff auf den Compiler einzuschränken, verwendet SQL Server Zugriffssteuerungslisten (ACCESS Control Lists, ACLs), um den Zugriff auf Binärdateien einzuschränken. Alle SQL Server-Binärdateien sind vor Änderungen oder Manipulationen durch ACLs geschützt. Die ACLs des nativen Compilers beschränken auch die Verwendung des Compilers; nur das SQL Server-Dienstkonto und Systemadministratoren verfügen über Lese- und Ausführungsberechtigungen für systemeigene Compilerdateien.

Durch eine systeminterne Kompilierung generierte Dateien

Die Dateien, die erzeugt werden, wenn eine Tabelle oder eine gespeicherte Prozedur kompiliert wird, umfassen die DLL und Zwischendateien, einschließlich Dateien mit den folgenden Erweiterungen: .c, .obj, .xml und .pdb. Die generierten Dateien werden in einem Unterordner des standardmäßigen Datenordners gespeichert. Der Unterordner wird Xtp genannt. Beim Installieren der Standardinstanz mit dem Standarddatenordner werden die generierten Dateien in C:\Program Files\Microsoft SQL Server\MSSQL13 abgelegt. MSSQLSERVER\MSSQL\DATA\Xtp.

SQL Server verhindert Manipulationen der generierten DLLs auf drei Arten:

  • Wenn eine Tabelle oder eine gespeicherte Prozedur zu einer DLL kompiliert wird, wird diese DLL sofort in den Arbeitsspeicher geladen und mit dem sqlserver.exe-Prozess verknüpft. Eine DLL kann nicht geändert werden, während sie mit einem Prozess verknüpft ist.

  • Wenn eine Datenbank neu gestartet wird, werden alle Tabellen und gespeicherten Prozeduren auf der Grundlage der Datenbankmetadaten neu kompiliert (entfernt und neu erstellt). Hierdurch werden alle Änderungen, die von einem böswilligen Benutzer an einer generierten Datei vorgenommen wurden, entfernt.

  • Die generierten Dateien werden als Teil der Benutzerdaten betrachtet und haben dieselben Sicherheitseinschränkungen über ACLs wie Datenbankdateien: Nur das SQL Server-Dienstkonto und Systemadministratoren können auf diese Dateien zugreifen.

Zum Verwalten dieser Dateien ist keine Benutzerinteraktion erforderlich. SQL Server erstellt und entfernt die Dateien nach Bedarf.

Weitere Informationen

Speicheroptimierte Tabellen

Nativ kompilierte gespeicherte Prozeduren