Kompilasi Asli Tabel dan Prosedur Tersimpan

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

OLTP Dalam Memori memperkenalkan konsep kompilasi asli. SQL Server dapat mengkompilasi prosedur tersimpan secara asli yang mengakses tabel yang dioptimalkan memori. SQL Server juga dapat mengkompilasi tabel yang dioptimalkan memori secara asli. Kompilasi asli memungkinkan akses data yang lebih cepat dan eksekusi kueri yang lebih efisien daripada Transact-SQL yang ditafsirkan (tradisional). Kompilasi asli tabel dan prosedur tersimpan menghasilkan DLL.

Kompilasi asli jenis tabel memori yang dioptimalkan juga didukung. Untuk informasi selengkapnya, lihat Tabel sementara dan variabel tabel yang lebih cepat dengan menggunakan pengoptimalan memori.

Kompilasi asli mengacu pada proses konversi konstruksi pemrograman ke kode asli, yang terdiri dari instruksi prosesor tanpa perlu kompilasi atau interpretasi lebih lanjut.

OLTP Dalam Memori mengkompilasi tabel yang dioptimalkan memori saat dibuat, dan mengkompilasi prosedur tersimpan secara asli saat dimuat ke DLL asli. Selain itu, DLL dikompresi ulang setelah database atau server dimulai ulang. Informasi yang diperlukan untuk membuat ulang DLL disimpan dalam metadata database. DLL bukan bagian dari database, meskipun dikaitkan dengan database. Misalnya, DLL tidak disertakan dalam cadangan database.

Catatan

Tabel yang dioptimalkan memori dikompresi ulang selama menghidupkan ulang server. Untuk mempercepat pemulihan database, prosedur tersimpan yang dikompilasi secara asli tidak dikompilasi ulang selama menghidupkan ulang server, prosedur tersebut dikompilasi pada saat eksekusi pertama. Sebagai hasil dari kompilasi yang ditangguhkan ini, prosedur tersimpan yang dikompilasi secara asli hanya muncul saat memanggil sys.dm_os_loaded_modules (Transact-SQL) setelah eksekusi pertama.

Pemeliharaan DLL OLTP Dalam Memori

Kueri berikut ini memperlihatkan semua DLL tabel dan prosedur tersimpan yang saat ini dimuat dalam memori di server:

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

Administrator database tidak perlu mempertahankan file yang dihasilkan oleh kompilasi asli. SQL Server secara otomatis menghapus file yang dihasilkan yang tidak lagi diperlukan. Misalnya, file yang dihasilkan akan dihapus saat tabel dan prosedur tersimpan dihapus, atau jika database dihilangkan.

Catatan

Jika kompilasi gagal atau terganggu, beberapa file yang dihasilkan tidak dihapus. File-file ini sengaja ditinggalkan untuk dukungan dan dihapus ketika database dihilangkan.

Catatan

SQL Server mengkompilasi DLL untuk semua tabel yang diperlukan untuk pemulihan database. Jika tabel dihilangkan tepat sebelum menghidupkan ulang database, masih ada sisa tabel dalam file titik pemeriksaan atau log transaksi sehingga DLL untuk tabel mungkin dikompilasi ulang selama mulai database. Setelah menghidupkan ulang DLL akan dibongkar dan file akan dihapus oleh proses pembersihan normal.

Kompilasi Asli Tabel

Membuat tabel yang dioptimalkan memori menggunakan pernyataan CREATE TABLE menghasilkan informasi tabel yang ditulis ke metadata database dan struktur tabel dan indeks yang dibuat dalam memori. Tabel juga akan dikompilasi ke DLL.

Pertimbangkan contoh skrip berikut, yang membuat database dan tabel yang dioptimalkan memori:

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

Membuat tabel juga membuat DLL tabel dan memuat DLL dalam memori. Kueri DMV segera setelah pernyataan CREATE TABLE mengambil jalur DLL tabel.

DLL tabel memahami struktur indeks dan format baris tabel. SQL Server menggunakan DLL untuk melintas indeks, mengambil baris, serta menyimpan konten baris.

Kompilasi Asli Prosedur Tersimpan

Prosedur tersimpan yang ditandai dengan NATIVE_COMPILATION dikompilasi secara asli. Ini berarti pernyataan Transact-SQL dalam prosedur semuanya dikompilasi ke kode asli untuk eksekusi logika bisnis penting performa yang efisien.

Untuk informasi selengkapnya tentang prosedur tersimpan yang dikompilasi secara asli, lihat Prosedur Tersimpan yang Dikompilasi Secara Asli.

Pertimbangkan contoh prosedur tersimpan berikut, yang menyisipkan baris dalam tabel t1 dari contoh sebelumnya:

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

DLL untuk native_sp dapat berinteraksi langsung dengan DLL untuk t1, serta mesin penyimpanan OLTP Dalam Memori, untuk menyisipkan baris secepat mungkin.

Pengkompilasi OLTP Dalam Memori memanfaatkan pengoptimal kueri untuk membuat rencana eksekusi yang efisien untuk setiap kueri dalam prosedur tersimpan. Perhatikan bahwa prosedur tersimpan yang dikompilasi secara asli tidak dikompilasi ulang secara otomatis jika data dalam tabel berubah. Untuk informasi selengkapnya tentang mempertahankan statistik dan prosedur tersimpan dengan OLTP Dalam Memori, lihat Statistik untuk Tabel yang Dioptimalkan Memori.

Pertimbangan Keamanan untuk Kompilasi Asli

Kompilasi asli tabel dan prosedur tersimpan menggunakan pengkompilasi OLTP Dalam Memori. Pengkompilasi ini menghasilkan file yang ditulis ke disk dan dimuat ke dalam memori. SQL Server menggunakan mekanisme berikut untuk membatasi akses ke file-file ini.

Pengkompilasi Asli

Compiler executable, serta biner dan file header yang diperlukan untuk kompilasi asli diinstal sebagai bagian dari instans SQL Server di bawah folder MSSQL\Binn\Xtp. Jadi, jika instans default diinstal di bawah C:\Program Files, file pengkompilasi diinstal di C:\Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\Binn\Xtp.

Untuk membatasi akses ke pengkompilasi, SQL Server menggunakan daftar kontrol akses (ACL) untuk membatasi akses ke file biner. Semua biner SQL Server dilindungi dari modifikasi atau perusakan melalui ACL. ACL kompilator asli juga membatasi penggunaan pengkompilasi; hanya akun layanan SQL Server dan administrator sistem yang telah membaca dan menjalankan izin untuk file kompilator asli.

File yang Dihasilkan oleh Kompilasi Asli

File yang dihasilkan ketika tabel atau prosedur tersimpan dikompilasi mencakup DLL dan file perantara termasuk file dengan ekstensi berikut: .c, .obj, .xml, dan .pdb. File yang dihasilkan disimpan dalam subfolder folder data default. Subfolder disebut Xtp. Saat menginstal instans default dengan folder data default, file yang dihasilkan ditempatkan di C:\Program Files\Microsoft SQL Server\MSSQL13. MSSQLSERVER\MSSQL\DATA\Xtp.

SQL Server mencegah perubahan dengan DLL yang dihasilkan dengan tiga cara:

  • Ketika tabel atau prosedur tersimpan dikompilasi ke DLL, DLL ini segera dimuat ke dalam memori dan ditautkan ke proses sqlserver.exe. DLL tidak dapat dimodifikasi saat ditautkan ke proses.

  • Saat database dimulai ulang, semua tabel dan prosedur tersimpan dikompresi ulang (dihapus dan dibuat ulang) berdasarkan metadata database. Ini akan menghapus perubahan apa pun yang dibuat pada file yang dihasilkan oleh agen berbahaya.

  • File yang dihasilkan dianggap sebagai bagian dari data pengguna, dan memiliki batasan keamanan yang sama, melalui ACL, sebagai file database: hanya akun layanan SQL Server dan administrator sistem yang dapat mengakses file-file ini.

Tidak diperlukan interaksi pengguna untuk mengelola file-file ini. SQL Server akan membuat dan menghapus file seperlunya.

Lihat Juga

Tabel yang Dioptimalkan Memori

Prosedur Tersimpan yang Dikompilasi Secara Asli