SQL Server 언어 확장과 SQL CLR 비교

적용 대상: SQL Server 2019(15.x) 이상 버전

이 문서에서는 SQL Server 언어 확장과 기본 CLR(공용 언어 런타임)을 비교합니다. 둘 사이의 주요 차이점을 확인하고 사용할 항목을 결정하는 데 도움이 됩니다.

SQL Server 언어 확장은 외부 코드를 실행하는 데 사용되는 SQL Server의 기능입니다. 확장성 프레임워크를 사용하여 외부 코드에서 관계형 데이터를 사용할 수 있습니다.

기본 CLR(공용 언어 런타임)을 사용하면 .NET 언어를 사용하여 SQL Server의 일부 기능을 구현할 수 있습니다. CLR은 관리 코드에 언어 간 통합, 코드 액세스 보안, 개체 수명 관리 및 디버깅과 프로파일링 지원 등의 서비스를 제공합니다.

SQL Server 언어 확장에서 사용할 수 있는 언어는 SQL CLR을 직접 대체하지 않습니다. 확장성 프레임워크 및 언어 확장은 SQL Server의 노출 영역을 확장하고 데이터베이스 엔진에 가까운 런타임에 대한 실행 환경을 제공합니다. 또한 엔진 변경 없이 새 런타임을 온보딩하는 데 사용할 수 있는 오픈 소스 프레임워크도 제공합니다. 현재 노출 영역은 시스템 저장 프로시저 sp_execute_external_script로 제한됩니다.

다음은 SQL 언어 확장과 SQL CLR 간의 몇 가지 주요 차이점입니다.

기능 SQL CLR SQL 언어 확장
플랫폼 지원 Windows 및 Linux - Linux는 SAFE 어셈블리만 지원합니다. Windows 및 Linux - 기능 측면에서 전체 패리티입니다.
실행 모드 In-proc Out-of-proc
격리 CLR 코드는 엔진 프로세스 내에서 실행됩니다. 인스턴스 관리자는 모든 어셈블리/코드를 신뢰해야 합니다. 런타임 실행은 엔진 프로세스 외부에 있습니다. Windows의 앱 컨테이너 또는 Linux의 네임스페이스를 사용하여 추가 격리가 제공됩니다. 외부 네트워크 통신도 기본적으로 사용하지 않도록 설정됩니다.
선언적 구문(T-SQL) 사용자 정의 형식, 사용자 정의 집계, 함수, 프로시저, 트리거. sp_execute_external_script를 사용하는 임시 실행만.
DDL 지원 CREATE ASSEMBLY를 통해 사용자 코드를 업로드하고 다른 개체(함수, 프로시저, 트리거 UDT, UDAggs)를 정의합니다. CREATE EXTERNAL LANGUAGE, EXTERNAL LIBRARY로 확장 및 라이브러리를 관리합니다.
라이브러리 지원 어셈블리를 통해 달성됩니다. 특정 런타임에 대한 라이브러리를 사용할 수 있습니다(예: R 또는 Python 패키지, Java 라이브러리).
런타임 지원 .NET Framework R, Python, Java, C# 또는 BYOR(Bring Your Own Runtime).
OSS 프레임워크 해당 없음 - 사용자 정의 .NET 어셈블리를 통해 확장할 수 있습니다. 예 - 확장 SDK는 엔진 변경 없이 새 확장을 작성하거나 런타임과 통합할 수 있습니다.
QO 통합 병렬 처리를 비롯한 다양한 구문에 대한 연산자 수준 통합입니다. 런타임에서 결과 및 데이터를 보내고 받는 단일 외부 스크립트 연산자이며, 이 연산자는 일괄 처리 모드 실행 및 병렬 처리를 지원합니다.
리소스 거버넌스 없음 - 리소스 관리자 외부의 노브가 거의 없습니다. 런타임/외부 스크립트에서 사용하는 리소스 제어를 위한 별도의 메커니즘으로 EXTERNAL RESOURCE POOL 개체를 제공하며, SQL 워크로드 외에도 외부 런타임에 대해 정책을 정의할 수 있습니다.
권한 모델 db 범위 지정 개체를 사용하는 인스턴스 수준 제어. db 범위 지정 개체를 사용하는 인스턴스 수준 제어.
성능 SQL CLR 코드는 일반적으로 실행 특성으로 인해 확장성을 능가합니다. 일괄 처리 지향 실행에 적합합니다.
모니터링 기능 sys.dm_clr* DMV 및 제한된 SQL CLR 특정 성능 모니터 카운터. sys.dm_external* DMV, 외부 리소스 풀 DMV, Windows JobObject 성능 모니터 카운터.

각각을 사용하는 경우

언어 확장 또는 CLR 사용 여부는 시나리오와 목표에 따라 달라집니다. 예를 들어 고유한 집계 또는 형식을 사용하여 T-SQL 노출 영역을 확장해야 하는 경우 확장성 메커니즘을 사용하여 형식 또는 집계를 정의할 수 없으므로 CLR이 가장 적합합니다. 반면 조직 또는 팀에서 기존 데이터 과학 전문 지식을 사용하려는 경우 확장성이 통합된 R/Python을 사용하는 것이 가장 좋습니다.

마찬가지로 성능 목표에 따라 결정이 좌우될 수 있습니다. C#에서 regex 함수를 구현하고 CLR을 사용하는 것은 확장성을 사용하여 동일한 regex 기능을 수행하는 Python 스크립트를 호출하는 것보다 훨씬 빠릅니다.