테이블 및 저장 프로시저의 네이티브 컴파일

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

메모리 내 OLTP에는 네이티브 컴파일 개념이 도입되었습니다. SQL Server는 메모리 최적화 테이블에 액세스하는 저장 프로시저를 기본적으로 컴파일할 수 있습니다. SQL Server는 메모리 최적화 테이블을 고유하게 컴파일할 수도 있습니다. 네이티브 컴파일을 사용하면 해석된(기존) Transact-SQL보다 더 빠른 데이터 액세스 및 보다 효율적인 쿼리 실행을 할 수 있습니다. 테이블 및 저장 프로시저의 네이티브 컴파일은 DLL을 생성합니다.

메모리 액세스에 최적화된 테이블 형식의 네이티브 컴파일도 지원됩니다. 자세한 내용은 메모리 최적화를 사용하여 빠른 임시 테이블 및 테이블 변수를 참조 하세요.

네이티브 컴파일은 추가로 컴파일하거나 해석할 필요 없이 프로세서 명령으로 구성된 네이티브 코드로 프로그래밍 구문을 변환하는 프로세스를 말합니다.

메모리 내 OLTP는 생성될 때 메모리 최적화 테이블을 컴파일하고 네이티브 DLL에 로드될 때 고유하게 컴파일된 저장 프로시저를 컴파일합니다. 또한 데이터베이스나 서버를 다시 시작한 후에도 DLL이 다시 컴파일됩니다. DLL을 다시 만드는 데 필요한 정보는 데이터베이스 메타데이터에 저장됩니다. DLL은 데이터베이스와 연결되어 있지만 데이터베이스의 일부는 아닙니다. 예를 들어 DLL은 데이터베이스 백업에 포함되지 않습니다.

참고 항목

메모리 최적화 테이블은 서버를 다시 시작하는 동안 다시 컴파일됩니다. 데이터베이스 복구 속도를 높이기 위해 고유하게 컴파일된 저장 프로시저는 서버를 다시 시작하는 동안 다시 컴파일되지 않으며 첫 번째 실행 시 컴파일됩니다. 이 지연된 컴파일의 결과로 고유하게 컴파일된 저장 프로시저는 첫 번째 실행 후에 sys.dm_os_loaded_modules(Transact-SQL)를 호출할 때만 표시됩니다.

메모리 내 OLTP DLL 유지 관리

다음 쿼리는 현재 서버의 메모리에 로드된 모든 테이블 및 저장 프로시저 DLL을 보여줍니다.

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

데이터베이스 관리자는 네이티브 컴파일에 의해 생성된 파일을 유지 관리할 필요가 없습니다. SQL Server는 더 이상 필요하지 않은 생성된 파일을 자동으로 제거합니다. 예를 들어 생성된 파일은 테이블 및 저장 프로시저가 삭제되거나 데이터베이스가 삭제될 때 삭제됩니다.

참고 항목

컴파일이 실패하거나 중단되면 생성된 일부 파일이 제거되지 않습니다. 이러한 파일은 지원 가능성을 위해 의도적으로 남겨지고 데이터베이스를 삭제할 때 제거됩니다.

참고 항목

SQL Server는 데이터베이스 복구에 필요한 모든 테이블에 대한 DLL을 컴파일합니다. 데이터베이스를 다시 시작하기 직전에 테이블을 삭제한 경우 데이터베이스를 시작하는 동안 테이블에 대한 DLL이 다시 컴파일될 수 있도록 검사점 파일 또는 트랜잭션 로그에 테이블의 잔재가 남아 있을 수 있습니다. 다시 시작한 후 DLL이 언로드되고 일반 정리 프로세스에서 파일이 제거됩니다.

테이블의 네이티브 컴파일

CREATE TABLE 문을 사용하여 메모리 최적화 테이블을 만들면 테이블 정보가 데이터베이스 메타데이터 및 메모리에서 생성된 테이블 및 인덱스 구조에 기록됩니다. 또한 테이블이 DLL로 컴파일됩니다.

데이터베이스와 메모리 최적화 테이블을 만드는 다음 샘플 스크립트를 고려합니다.

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

테이블을 만들면 테이블 DLL도 만들어지고 DLL이 메모리에 로드됩니다. CREATE TABLE 문이 테이블 DLL의 경로를 검색한 직후 DMV 쿼리입니다.

테이블 DLL은 테이블의 인덱스 구조 및 행 형식을 이해합니다. SQL Server는 DLL을 사용하여 인덱스를 트래버스하고 행을 검색하며 행의 내용을 저장합니다.

저장 프로시저의 네이티브 컴파일

NATIVE_COMPILATION으로 표시된 저장 프로시저는 고유하게 컴파일됩니다. 즉, 프로시저의 Transact-SQL 문은 모두 성능에 중요한 비즈니스 논리를 효율적으로 실행하기 위해 네이티브 코드로 컴파일됩니다.

고유하게 컴파일된 저장 프로시저에 대한 자세한 내용은 Natively Compiled Stored Procedures를 참조하세요.

다음 예제 저장 프로시저에서는 이전 예제의 테이블 t1에 행을 삽입합니다.

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

native_sp DLL은 메모리 내 OLTP 스토리지 엔진뿐만 아니라 t1용 DLL과 직접 상호 작용하여 행을 최대한 빨리 삽입할 수 있습니다.

메모리 내 OLTP 컴파일러는 쿼리 최적화 프로그램을 이용하여 저장 프로시저의 각 쿼리에 대한 효율적인 실행 계획을 만듭니다. 테이블의 데이터가 변경되면 고유하게 컴파일된 저장 프로시저가 자동으로 다시 컴파일되지 않습니다. 메모리 내 OLTP를 사용하여 통계 및 저장 프로시저를 유지하는 방법에 대한 자세한 내용은 메모리 최적화 테이블에 대한 통계를 참조 하세요.

네이티브 컴파일에 대한 보안 고려 사항

테이블 및 저장 프로시저의 네이티브 컴파일은 메모리 내 OLTP 컴파일러를 사용합니다. 이 컴파일러는 디스크에 기록되고 메모리에 로드되는 파일을 생성합니다. SQL Server는 다음 메커니즘을 사용하여 이러한 파일에 대한 액세스를 제한합니다.

네이티브 컴파일러

컴파일러 실행 파일과 네이티브 컴파일에 필요한 이진 파일 및 헤더 파일은 MSSQL\Binn\Xtp 폴더 아래에 SQL Server 인스턴스의 일부로 설치됩니다. 따라서 기본 인스턴스가 C:\Program Files 아래에 설치된 경우 컴파일러 파일은 C:\Program Files\Microsoft SQL Server\MSSQL13에 설치됩니다. MSSQLSERVER\MSSQL\Binn\Xtp.

컴파일러에 대한 액세스를 제한하기 위해 SQL Server는 ACL(액세스 제어 목록)을 사용하여 이진 파일에 대한 액세스를 제한합니다. 모든 SQL Server 이진 파일은 ACL을 통한 수정 또는 변조로부터 보호됩니다. 네이티브 컴파일러의 ACL은 컴파일러의 사용도 제한합니다. SQL Server 서비스 계정 및 시스템 관리자만 네이티브 컴파일러 파일에 대한 읽기 및 실행 권한이 있습니다.

네이티브 컴파일에서 생성된 파일

테이블 또는 저장 프로시저가 컴파일될 때 생성되는 파일에는 확장명 .c, .obj, .xml 및 .pdb를 포함하는 DLL 및 중간 파일이 포함됩니다. 생성된 파일은 기본 데이터 폴더의 하위 폴더에 저장됩니다. 하위 폴더를 Xtp라고 부릅니다. 기본 데이터 폴더를 사용하여 기본 인스턴스를 설치할 때 생성된 파일은 C:\Program Files\Microsoft SQL Server\MSSQL13에 배치됩니다. MSSQLSERVER\MSSQL\DATA\Xtp.

SQL Server는 다음과 같은 세 가지 방법으로 생성된 DLL의 변조를 방지합니다.

  • 테이블 또는 저장 프로시저가 DLL로 컴파일되면 이 DLL은 즉시 메모리에 로드되고 sqlserver.exe 프로세스에 연결됩니다. 프로세스에 연결된 동안에는 DLL을 수정할 수 없습니다.

  • 데이터베이스를 다시 시작하면 데이터베이스 메타데이터에 따라 모든 테이블 및 저장 프로시저가 다시 컴파일(제거 및 다시 생성)됩니다. 이렇게 하면 악의적인 에이전트에 의해 생성된 파일에 대한 변경 내용이 제거됩니다.

  • 생성된 파일은 사용자 데이터의 일부로 간주되며 ACL을 통해 데이터베이스 파일과 동일한 보안 제한이 있습니다. SQL Server 서비스 계정 및 시스템 관리자만 이러한 파일에 액세스할 수 있습니다.

이러한 파일을 관리하는 데 사용자 상호 작용이 필요하지 않습니다. SQL Server는 필요에 따라 파일을 만들고 제거합니다.

참고 항목

메모리 최적화 테이블

고유하게 컴파일된 저장 프로시저