다음을 통해 공유


네이티브 컴파일된 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 문에서 지원됩니다.

흐름 제어 언어

다음과 같은 흐름 제어 언어 구문이 지원됩니다.

지원되는 연산자

지원되는 연산자는 다음과 같습니다.

  • 비교 연산자(Transact-SQL)(예: >, <, >=, <=)

  • 단항 연산자(+, -).

  • 이항 연산자(*, /, +, -, % (모듈로)).

    • 더하기 연산자(+)는 숫자 및 문자열에서 모두 지원됩니다.
  • 논리 연산자(AND, OR, NOT).

  • 비트 연산자 ~, &, |, ^

  • 연산자 적용

    • 적용 대상: SQL Server 2017(14.x).
      SQL Server 2017(14.x)부터 APPLY 연산자는 네이티브 컴파일된 모듈에서 지원됩니다.

네이티브 컴파일된 모듈의 기본 제공 함수

다음 함수는 메모리 최적화 테이블의 제약 조건 및 네이티브 컴파일된 T-SQL 모듈에서 지원됩니다.

  • 모든 수학 함수(Transact-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과 같은 기본 제공 함수도 지원됩니다.
  • ID 함수: SCOPE_IDENTITY

  • NULL 함수: ISNULL

  • Uniqueidentifier 함수: NEWID, NEWSEQUENTIALID

  • JSON 함수

    • 적용 대상: SQL Server 2017(14.x).
      SQL Server 2017(14.x)부터 JSON 함수는 네이티브 컴파일된 모듈에서 지원됩니다.
  • 오류 함수: 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()

  • 네이티브 모듈의 실행을 중첩할 수 있습니다.

감사

프로시저 수준 감사는 네이티브 컴파일된 저장 프로시저에서 지원됩니다.

감사에 대한 자세한 내용은 서버 감사 및 데이터베이스 감사 사양 만들기를 참조하세요.

테이블 및 쿼리 힌트

지원되는 형식은 다음과 같습니다.

자세한 내용은 쿼리 힌트(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 )

참고 항목

고유하게 컴파일된 저장 프로시저
네이티브 컴파일된 저장 프로시저의 마이그레이션 문제