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 스크립트를 호출하는 것보다 훨씬 빠릅니다.