고유하게 컴파일된 T-SQL 모듈에 지원되는 기능

적용 대상:SQL ServerAzure SQL DatabaseAzure 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)부터 CASE 문은 이제 고유하게 컴파일된 T-SQL 모듈에 대해 지원됩니다.

SELECT 절:

  • 열 및 이름 별칭(AS 또는 = 구문 사용).

  • 스칼라 하위 쿼리

    • 적용 대상: SQL Server 2016(13.x). SQL Server 2016(13.x)부터 스칼라 하위 쿼리는 이제 고유하게 컴파일된 모듈에서 지원됩니다.
  • 맨 위로*

  • 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는 nvarchar, 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 ... 선택

  • UPDATE

  • Delete

  • WHERE는 UPDATE 및 DELETE 문에서 지원됩니다.

흐름 제어 언어

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

지원되는 연산자

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

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

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

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

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

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

  • APPLY 연산자

    • 적용 대상: 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()입니다.

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

감사

프로시저 수준 감사는 고유하게 컴파일된 저장 프로시저에서 지원됩니다.

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

테이블 및 쿼리 힌트

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

  • 테이블 힌트 구문 또는 쿼리의 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 연산자에 대해 최대 8192개의 행을 지정할 수 있습니다. 8192개 이상의 행을 지정하면 오류 메시지가 표시됩니다. Msg 41398, Level 16, State 1, Procedure <procedureName>, Line lineNumber<>TOP 연산자는 최대 8192개의 행을 반환할 수 있습니다. <번호>가 요청되었습니다.

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 행 제한은 앞의 TOP N 예제와 같이 상수가 있는 위치에 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 연산자에서 반환할 수 있는 행 수를 잠재적으로 줄일 수 있는 두 가지 경우는 다음과 같습니다.

  • 쿼리에서 JON 사용. 제한에 대한 JOIN의 영향은 쿼리 계획에 따라 달라집니다.

  • ORDER BY 절에서 집계 함수 또는 참조를 사용하여 함수를 집계합니다.

TOP N에서 지원되는 최악의 경우 최대 N을 계산하는 수식은 다음과 N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )같습니다.

참고 항목

고유하게 컴파일된 저장 프로시저
고유하게 컴파일된 저장 프로시저에 대한 마이그레이션 문제