네이티브 컴파일된 T-SQL 모듈에 지원되는 기능
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
이 항목에는 저장 프로시저(CREATE PROCEDURE(Transact-SQL)), 스칼라 사용자 정의 함수, 인라인 테이블 반환 함수, 트리거와 같이 네이티브 컴파일된 T-SQL 모듈 본문의 T-SQL 노출 영역 및 지원되는 기능 목록이 포함되어 있습니다.
네이티브 모듈 정의와 관련하여 지원되는 기능은 네이티브 컴파일된 T-SQL 모듈에 대해 지원되는 DDL을 참조하세요.
고유하게 컴파일된 모듈에서 지원되지 않는 구문에 대한 자세한 내용과 지원되지 않는 일부 기능을 해결하는 방법은 Migration Issues for Natively Compiled Stored Procedures를 참조하세요. 지원되지 않는 기능에 대한 자세한 내용은 메모리 내 OLTP에서 지원되지 않는 Transact-SQL 구문을 참조하세요.
네이티브 모듈의 쿼리 노출 영역
다음 쿼리 구문은 지원되지 않습니다.
CASE 표현식: CASE는 유효한 식이 허용되는 모든 문 또는 절에 사용할 수 있습니다.
- 적용 대상: SQL Server 2017(14.x).
SQL Server 2017(14.x)부터 이제 네이티브 컴파일된 T-SQL 모듈에서 CASE 문이 지원됩니다.
SELECT 절:
열 및 이름 별칭(AS 또는 = 구문 사용)
스칼라 하위 쿼리
- 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 스칼라 하위 쿼리는 이제 네이티브 컴파일된 모듈에서 지원됩니다.
TOP*
SELECT DISTINCT
적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 DISTINCT 연산자는 네이티브 컴파일된 모듈에서 지원됩니다.
- DISTINCT 집계는 지원되지 않습니다.
UNION 및 UNION ALL
- 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 UNION 및 UNION ALL 연산자는 이제 네이티브 컴파일된 모듈에서 지원됩니다.
변수 할당
FROM 절:
FROM <메모리 최적화 테이블 또는 테이블 변수>
FROM <네이티브 컴파일된 인라인 TVF>
LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN 및 INNER JOIN
- 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 JOINS는 이제 네이티브 컴파일된 모듈에서 지원됩니다.
하위 쿼리
[AS] table_alias
. 자세한 내용은 FROM(Transact-SQL)을 참조하세요.- 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 하위 쿼리는 이제 네이티브 컴파일된 모듈에서 지원됩니다.
WHERE 절:
필터 조건자 IS [NOT] NULL
AND, BETWEEN
OR, NOT, IN, EXISTS
- 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 OR/NOT/IN/EXISTS 연산자는 이제 네이티브 컴파일된 모듈에서 지원됩니다.
GROUP BY 절:
집계 함수 AVG, COUNT, COUNT_BIG, MIN, MAX, SUM.
MIN 및 MAX는 varchar, char, varchar, varchar, varbinary, binary 형식에서 지원되지 않습니다.
ORDER BY 절:
ORDER BY 절에서는 DISTINCT가 지원되지 않습니다.
ORDER BY 목록의 식이 GROUP BY 목록에 그대로 표시되는 경우 GROUP BY(Transact-SQL)에서 지원됩니다.
- 예를 들어 GROUP BY a + b ORDER BY a + b는 지원되지만 GROUP BY a, b ORDER BY a + b는 지원되지 않습니다.
HAVING 절:
- WHERE 절과 동일한 식 제한 사항이 적용됩니다.
ORDER BY 및 TOP은 네이티브 컴파일된 모듈에서 지원되며 몇 가지 제한 사항이 있습니다.
TOP 절에는 WITH TIES 또는 PERCENT가 지원되지 않습니다.
ORDER BY 절에서는 DISTINCT가 지원되지 않습니다.
TOP 절에서 상수 사용 시 ORDER BY와 결합된 TOP은 8,192개를 초과하여 지원하지 않습니다.
- 쿼리에 조인 또는 집계 함수가 포함된 경우 이 한도가 낮아질 수 있습니다. (예를 들어 조인 1개(테이블 2개)를 사용하는 경우 한도는 4,096개 행입니다. 조인 2개(테이블 3개)가 있는 경우 한도는 2,730개 행입니다.)
- 변수에 행 수를 저장하여 8,192보다 큰 결과를 얻을 수 있습니다.
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...
그러나 TOP 절의 상수는 변수를 사용할 때와 비교하여 성능이 향상됩니다.
네이티브 컴파일된 Transact-SQL에 대한 이러한 제한은 메모리 최적화 테이블에서 해석된 Transact-SQL 액세스에는 적용되지 않습니다.
데이터 수정
다음과 같은 DML 문이 지원됩니다.
INSERT VALUES(문당 하나의 행) 및 INSERT ... SELECT
UPDATE
Delete
WHERE는 UPDATE 및 DELETE 문에서 지원됩니다.
흐름 제어 언어
다음과 같은 흐름 제어 언어 구문이 지원됩니다.
DECLARE @local_variable (Transact-SQL)은 메모리 내 OLTP에 지원되는 모든 데이터 형식과 메모리 최적화 테이블 형식을 사용할 수 있습니다. 변수는 NULL 또는 NOT NULL로 선언할 수 있습니다.
-
- 성능을 최적화하려면 고유하게 컴파일된 전체 T-SQL 모듈에 대해 단일 TRY/CATCH 블록을 사용합니다.
BEGIN ATOMIC(저장 프로시저의 외부 수준). 자세한 내용은 Atomic 블록을 참조하세요.
지원되는 연산자
지원되는 연산자는 다음과 같습니다.
비교 연산자(Transact-SQL)(예: >, <, >=, <=)
단항 연산자(+, -).
이항 연산자(*, /, +, -, % (모듈로)).
- 더하기 연산자(+)는 숫자 및 문자열에서 모두 지원됩니다.
논리 연산자(AND, OR, NOT).
비트 연산자 ~, &, |, ^
연산자 적용
- 적용 대상: SQL Server 2017(14.x).
SQL Server 2017(14.x)부터 APPLY 연산자는 네이티브 컴파일된 모듈에서 지원됩니다.
- 적용 대상: SQL Server 2017(14.x).
네이티브 컴파일된 모듈의 기본 제공 함수
다음 함수는 메모리 최적화 테이블의 제약 조건 및 네이티브 컴파일된 T-SQL 모듈에서 지원됩니다.
날짜 함수: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, YEAR
문자열 함수: LEN, LTRIM, RTRIM, SUBSTRING
- 적용 대상: SQL Server 2017(14.x).
SQL Server 2017(14.x)부터 TRIM, TRANSLATE, CONCAT_WS과 같은 기본 제공 함수도 지원됩니다.
- 적용 대상: SQL Server 2017(14.x).
ID 함수: SCOPE_IDENTITY
NULL 함수: ISNULL
Uniqueidentifier 함수: NEWID, NEWSEQUENTIALID
JSON 함수
- 적용 대상: SQL Server 2017(14.x).
SQL Server 2017(14.x)부터 JSON 함수는 네이티브 컴파일된 모듈에서 지원됩니다.
- 적용 대상: SQL Server 2017(14.x).
오류 함수: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE
시스템 함수: @@rowcount. 고유하게 컴파일된 저장 프로시저 내의 문은 @@rowcount를 업데이트합니다. 고유하게 컴파일된 저장 프로시저에서 @@rowcount를 사용하여 고유하게 컴파일된 저장 프로시저 내에서 실행된 마지막 문의 영향을 받는 행의 수를 확인할 수 있습니다. 그러나 @@rowcount는 네이티브 컴파일된 저장 프로시저의 실행이 시작될 때와 끝날 때 0으로 다시 설정됩니다.
보안 함수: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO()
네이티브 모듈의 실행을 중첩할 수 있습니다.
감사
프로시저 수준 감사는 네이티브 컴파일된 저장 프로시저에서 지원됩니다.
감사에 대한 자세한 내용은 서버 감사 및 데이터베이스 감사 사양 만들기를 참조하세요.
테이블 및 쿼리 힌트
지원되는 형식은 다음과 같습니다.
테이블 힌트 구문 또는 쿼리의 OPTION 절(Transact-SQL)에서 INDEX, FORCESCAN, FORCESEEK 힌트를 제공합니다. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.
FORCE ORDER
LOOP JOIN 힌트
OPTIMIZE FOR
자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.
정렬의 제한 사항
TOP(Transact-SQL) 및 ORDER BY 절(Transact-SQL)을 사용하는 쿼리에서 8,000개 이상의 행을 정렬할 수 있습니다. 그러나 ORDER BY 절(Transact-SQL)이 없으면 TOP(Transact-SQL)은 최대 8,000개의 행(조인이 있는 경우 행 수 감소)을 정렬할 수 있습니다.
쿼리에서 TOP(Transact-SQL) 연산자와 ORDER BY 절(Transact-SQL)을 모두 사용하는 경우 TOP 연산자에 대해 최대 8,192개의 행을 지정할 수 있습니다. 8,192개를 초과하는 행을 지정할 경우 오류 메시지 표시: 메시지 41398, 레벨 16, 상태 1, 프로시저 <procedureName>, 줄 <lineNumber> TOP 연산자는 최대 8,192개의 행을 반환할 수 있습니다. <number>개가 요청되었습니다.
TOP 절이 없는 경우 ORDER BY를 사용하여 여러 행을 정렬할 수 있습니다.
ORDER BY 절을 사용하지 않는 경우 TOP 연산자에 정수 값을 사용할 수 있습니다.
TOP N = 8192인 경우의 예: 컴파일
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
TOP N > 8192인 경우의 예: 컴파일 실패
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
8192 행 제한은 앞의 예제와 같이 N
이 상수인 TOP N
에만 적용됩니다. 8192보다 큰 N
이 필요한 경우 값을 변수에 할당하고 이 변수를 TOP
과 함께 사용할 수 있습니다.
변수를 사용하는 예제: 컴파일
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
DECLARE @v int = 8193
SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
반환된 행에 대한 제한: TOP 연산자에서 반환할 수 있는 행 수를 잠재적으로 줄일 수 있는 두 가지 경우는 다음과 같습니다.
쿼리에서 JOIN 사용. 제한에 대한 JOIN의 영향은 쿼리 계획에 따라 달라집니다.
ORDER BY 절에서 집계 함수 또는 참조를 사용하여 함수를 집계합니다.
TOP N에서 지원되는 최악의 경우 최대 N을 계산하는 수식은 다음과 같습니다. N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )