Confronto tra le estensioni del linguaggio SQL Server e SQL CLR

Si applica a: SQL Server 2019 (15.x) e versioni successive

Questo articolo offre un confronto tra le estensioni del linguaggio SQL Server e il Common Language Runtime (CLR) nativo. Identifica le differenze principali e aiuta a decidere quale usare.

Le estensioni del linguaggio SQL Server sono una funzionalità di SQL Server usata per l'esecuzione di codice esterno. I dati relazionali possono essere usati nel codice esterno tramite il framework di estendibilità.

Il Common Language Runtime (CLR) nativo consente di implementare alcune delle funzionalità di SQL Server con linguaggi .NET. CLR fornisce codice gestito con servizi quali l'integrazione tra linguaggi diversi, la sicurezza da accesso di codice, la gestione della durata degli oggetti e il supporto per il debug e il profiling.

I linguaggi disponibili nelle estensioni del linguaggio SQL Server non sono una sostituzione diretta di SQL CLR. Il framework di estendibilità e le estensioni del linguaggio estendono la superficie di SQL Server e forniscono un ambiente di esecuzione per i runtime più prossimo al motore di database. Forniscono anche un framework open source che può essere usato per eseguire l'onboarding di nuovi runtime senza modifiche del motore. Attualmente la superficie è limitata alla stored procedure di sistema sp_execute_external_script.

Di seguito sono riportate alcune delle differenze chiave tra le estensioni del linguaggio SQL e SQL CLR:

Funzionalità SQL CLR Estensioni del linguaggio SQL
Piattaforme supportate Windows e Linux: Linux supporta solo assembly SAFE. Windows e Linux: parità completa in termini di funzionalità.
Modalità di esecuzione In-process Out-of-process
Isolamento Il codice CLR viene eseguito all'interno del processo del motore; l'amministratore dell'istanza deve considerare attendibili tutti gli assembly/tutto il codice. L'esecuzione del runtime avviene al di fuori del processo del motore. Viene fornito un ulteriore isolamento tramite i contenitori di app in Windows o gli spazi dei nomi in Linux. Inoltre, la comunicazione di rete esterna è disabilitata per impostazione predefinita.
Sintassi dichiarativa (T-SQL) Tipi definiti dall'utente, aggregazioni definite dall'utente, funzioni, procedure, trigger. Solo l'esecuzione ad hoc tramite sp_execute_external_script.
Supporto DDL CREATE ASSEMBLY per caricare il codice utente e definire altri oggetti (funzioni, processi, UDT trigger, aggregazioni definite dall'utente). CREATE EXTERNAL LANGUAGE, EXTERNAL LIBRARY per gestire estensioni e librerie.
Supporto per le librerie Ottenuto tramite assembly. È possibile usare librerie per un runtime specifico, ad esempio pacchetti R o Python e librerie Java.
Runtime supportati .NET Framework R, Python, Java, C# o Bring Your Own Runtime (BYOR).
Framework OSS N/D: estendibile tramite assembly .NET definiti dall'utente. Sì: l'SDK di estensione fornisce la creazione di nuove estensioni o l'integrazione con runtime senza modifiche al motore.
Integrazione QO Integrazione a livello di operatore per varie sintassi, incluso il parallelismo. Singolo operatore di script esterno per inviare/ricevere risultati e dati dai runtime; questo operatore supporta l'esecuzione in modalità batch e il parallelismo.
Governance delle risorse Nessuna: poche opzioni al di fuori di Resource Governor. Fornisce l'oggetto EXTERNAL RESOURCE POOL come meccanismo separato per gestire le risorse utilizzate dagli script di runtime/esterni; è possibile definire criteri per i runtime esterni oltre al carico di lavoro SQL.
Modello di autorizzazione Controllo a livello di istanza con oggetti con ambito database. Controllo a livello di istanza con oggetti con ambito database.
Prestazioni Il codice SQL CLR in genere offre prestazioni superiori rispetto all'estendibilità, data la natura dell'esecuzione. Ideale per l'esecuzione orientata ai batch.
Funzionalità di monitoraggio sys.dm_clr* DMV e contatore Monitor prestazioni limitato specifico di SQL CLR. sys.dm_external* DMV, DMV del pool di risorse esterne, contatori Monitor prestazioni JobObject di Windows.

Scegliere la soluzione più adatta

La decisione di usare le estensioni del linguaggio o CLR dipende dai propri scenari e obiettivi. Ad esempio, se è necessario estendere la superficie di T-SQL con aggregazioni o tipi personalizzati, CLR è la scelta migliore perché non è possibile definire il tipo o l'aggregazione con il meccanismo dell'estendibilità. Viceversa, se si vogliono usare le competenze di data science esistenti nella propria organizzazione o nel proprio team, l'integrazione di R/Python con l'estendibilità è la scelta migliore.

Analogamente, la decisione potrebbe essere determinata da obiettivi di prestazioni. L'implementazione di una funzione regex in C# e l'uso di CLR è molto più veloce rispetto all'uso dell'estendibilità per richiamare uno script Python che esegue la stessa funzionalità regex.