증상
Transact-SQL 구현되고 단일 데이터 값을 반환하는 UDF(User-Defined Functions)를 T-SQL 스칼라 User-Defined 함수(UDF)라고 합니다.
2019년 Microsoft SQL Server UDF 실행이 주요 병목 상태인 T-SQL 스칼라 UDF를 호출하는 쿼리의 성능을 향상시킬 수 있는 스칼라 UDF 인라인 기능을 도입했습니다. T-SQL 스칼라 UDF 인라인 처리는 인라인 가능 UDF를 관계형 식으로 자동으로 변환합니다.
이 누적 업데이트에는 스칼라 UDF 인라인을 사용하는 쿼리가 오류 또는 예기치 않은 결과를 반환할 수 있는 시나리오에 대한 다음 영역에 대한 몇 가지 수정 사항이 포함되어 있습니다.
-
UDF의 반환 형식이 sql_variant 경우 형식 불일치 오류(Microsoft SQL Server 2019 CU2에 추가됨)
-
sp_executesql UDF 호출은 실행을 중단합니다(Microsoft SQL Server 2019 CU2에 추가됨).
-
연결된 GOTO 명령 없이 레이블을 참조하는 UDF는 잘못된 결과를 반환합니다(Microsoft SQL Server 2019 CU2에 추가됨).
-
매우 큰 스칼라 UDF(2019 CU2 Microsoft SQL Server 추가됨)로 인해 메모리 부족 상태 및 메모리 누수가 발생합니다.
-
조건(IF-ELSE) 문에 사용되는 초기화되지 않은 변수로 인해 오류가 발생합니다(Microsoft SQL Server 2019 CU2에 추가됨).
-
UDF에 SQL_VARIANT 매개 변수가 있는 경우 명시적 변환 오류(Microsoft SQL Server 2019 CU7에 추가됨)
-
스칼라 함수가 CHECKSUM을 참조할 때 발생하는 오류(Microsoft SQL Server 2019 CU7에 추가됨)
-
스칼라 식이 많은 UDF 호출을 다시 평가하면 생성하지 않는 스케줄러 오류가 발생할 수 있습니다(Microsoft SQL Server 2019 CU7에 추가됨).
-
UDF 참조 쿼리가 OPTION(RECOMPILE)을 사용할 때 발생하는 오류(Microsoft SQL Server 2019 CU7에 추가됨)
-
뷰가 인라인 UDF를 호출할 때 발생하는 권한 오류(Microsoft SQL Server 2019 CU9에 추가됨)
-
XEvent query_tsql_scalar_udf_inlined 사용할 때 발생하는 액세스 위반(Microsoft SQL Server 2019 CU9에서 추가됨)
-
스칼라 UDF 인라인 처리로 인해 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 쿼리 힌트가 적용되지 않아 일관되지 않은 동작(Microsoft SQL Server 2019 CU9에 추가됨)
-
인라인 UDF에는 생성하지 않는 스케줄러 오류가 발생할 수 있는 집계가 포함되어 있습니다(Microsoft SQL Server 2019 CU9에 추가됨).
-
조건부 블록의 동일한 변수에 대한 스칼라 작업 시퀀스로 인한 메모리 부족 오류(Microsoft SQL Server 2019 CU9에 추가됨)
-
CU9로 업그레이드한 후 입력 매개 변수로 사용되는 스칼라 인라인 가능 UDF(UDF2)를 사용하여 개체가 스칼라 인라인 가능 UDF(UDF1)를 호출할 때 액세스 위반이 발생할 수 있습니다(Microsoft SQL Server 2019 CU11에 추가됨).
-
UDF 인라인으로 인해 다음 오류 코드 6846, 1011 및 107(Microsoft SQL Server 2019 CU11에 추가됨)에 오류가 발생할 수 있습니다.
-
sysadmin이 아닌 계정으로 실행되는 UDF를 인라인 처리하면 '현재 명령에서 심각한 오류가 발생했습니다. 결과가 있는 경우 삭제해야 합니다.' (Microsoft SQL Server 2019 CU16에 추가됨)
이 누적 업데이트는 다음 시나리오에서도 인라인을 차단합니다.
-
UDF가 인라인 처리 시 결과를 변경할 수 있는 특정 내장 함수(예: @@ROWCOUNT)를 참조하는 경우(Microsoft SQL Server 2019 CU2에 추가됨)
-
집계 함수가 스칼라 UDF에 매개 변수로 전달되는 경우(Microsoft SQL Server 2019 CU2에 추가됨)
-
UDF가 기본 제공 뷰(예: OBJECT_ID)를 참조하는 경우(Microsoft SQL Server 2019 CU2에 추가됨)
-
UDF에서 XML 메서드를 사용하는 경우(Microsoft SQL Server 2019 CU4에 추가됨)
-
UDF에 "TOP 1"이 없는 ORDER BY가 있는 SELECT가 포함된 경우(Microsoft SQL Server 2019 CU4에서 추가됨)
-
SELECT 쿼리가 ORDER BY 절과 함께 할당을 수행하는 경우(예: SELECT @x = @x +1 FROM TABLE ORDER BY column_name) (Microsoft SQL Server 2019 CU4에 추가됨)
-
UDF에 여러 RETURN 문이 포함된 경우(Microsoft SQL Server 2019 CU5에 추가됨)
-
RETURN 문에서 UDF가 호출되는 경우(Microsoft SQL Server 2019 CU5에 추가됨)
-
UDF가 STRING_AGG 함수를 참조하는 경우(Microsoft SQL Server 2019 CU5에 추가됨)
-
UDF 정의가 원격 테이블을 참조하는 경우(Microsoft SQL Server 2019 CU6에 추가됨)
-
UDF 호출 쿼리가 GROUPING SETS, CUBE 또는 ROLLUP을 사용하는 경우(Microsoft SQL Server 2019 CU6에 추가됨)
-
UDF 호출 쿼리에 할당에 대한 UDF 매개 변수로 사용되는 변수가 포함된 경우(예: SELECT @y=2, @x=UDF(@y)) (Microsoft SQL Server 2019 CU6에 추가됨)
-
UDF가 암호화된 열을 참조하는 경우(Microsoft SQL Server 2019 CU11에 추가됨)
-
UDF에 'WITH XMLNAMESPACES'에 대한 참조가 포함된 경우(Microsoft SQL Server 2019 CU11에 추가됨)
-
UDF를 호출하는 쿼리에 CTE(Common Table Expressions)가 있는 경우(Microsoft SQL Server 2019 CU11에 추가됨)
Microsoft SQL Server 2019 CU2로 업그레이드한 후 CU5로 업그레이드하기 전에 UDF가 인라인 처리에 적합한지 여부를 다시 평가해야 합니다. 이렇게 하려면 다음 방법 중 하나를 통해 적격 스칼라 UDF를 새로 고칩니다.
-
해당되는 스칼라 UDF에 대한 sp_refreshsqlmodule 실행(이 시스템 저장 프로시저에 대한 자세한 내용은 sp_refreshsqlmodule(Transact-SQL 참조)
-
기존 정의, 사용 권한 및 설정 속성을 사용하여 기존 스칼라 UDF를 변경하거나 다시 만듭니다(ALTER FUNCTION(Transact-SQL 참조))
다음 스크립트는 기존 인라인 스칼라 UDF에 대한 메타데이터를 새로 고치는 스크립트를 생성합니다.
/*
Generates a script that can be used to refresh all active inlineable scalar UDFs.
Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.
*/
SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)
+ ']'';' AS 'RefreshStatement'
FROM sys.sql_modules
WHERE is_inlineable = 1
AND inline_type = 1;
GO
참고 Microsoft SQL Server 2019 CU5로 업그레이드하면 컴파일 중에 UDF 인라인성이 자동으로 파생됩니다.
해결 방법
이 문제는 SQL Server 대한 다음 누적 업데이트에서 해결되었습니다.
SQL Server 대한 각각의 새로운 누적 업데이트에는 모든 핫픽스 및 이전 누적 업데이트에 포함된 모든 보안 수정 사항이 포함됩니다. SQL Server 대한 최신 누적 업데이트를 확인하세요.
상태
Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.
참고 자료
Microsoft가 소프트웨어 업데이트를 설명하는 데 사용하는 용어에 대해 알아보세요.