Delen via


SQL Server-taalextensies vergelijken met SQL CLR

Van toepassing op: SQL Server 2019 (15.x) en latere versies

In dit artikel worden SQL Server Language Extensions en de native Common Language Runtime (CLR) vergeleken. Hiermee worden de belangrijkste verschillen tussen deze twee geïdentificeerd en kunt u bepalen welke u wilt gebruiken.

SQL Server Language Extensions is een functie van SQL Server die wordt gebruikt voor het uitvoeren van externe code. De relationele gegevens kunnen worden gebruikt in de externe code met behulp van het uitbreidbaarheidsframework.

Met de native Common Language Runtime (CLR) kunt u enkele functies van SQL Server implementeren met .NET-talen. De CLR levert beheerde code met services zoals integratie tussen talen, beveiliging van codetoegang, levensduurbeheer van objecten en ondersteuning voor foutopsporing en profilering.

De talen die beschikbaar zijn in SQL Server Language Extensions zijn geen directe vervanging voor SQL CLR. Het uitbreidbaarheidsframework en de taalextensies breiden het oppervlak van SQL Server uit en bieden een uitvoeringsomgeving voor runtimes dichter bij de database-engine. Ze bieden ook een opensource-framework dat kan worden gebruikt voor het onboarden van nieuwe runtimes zonder enginewijzigingen. Momenteel is het oppervlak beperkt tot de systeem opgeslagen procedure, sp_execute_external_script.

Hier volgen enkele van de belangrijkste verschillen tussen SQL-taalextensies en SQL CLR:

Eigenschap SQL CLR SQL-taalextensies
Platformondersteuning Windows & Linux - Linux ondersteunt alleen SAFE assembly's. Windows & Linux - volledige pariteit in termen van functionaliteit.
Uitvoeringsmodus In-proc Out-of-proc
Isolatie CLR-code wordt uitgevoerd binnen het engineproces; instantiebeheerder moet alle assembly's/code vertrouwen. Runtime-uitvoering valt buiten het engineproces. Verdere isolatie wordt geboden met app-containers in Windows of naamruimten in Linux. Externe netwerkcommunicatie is ook standaard uitgeschakeld.
Declaratieve syntaxis (T-SQL) Door de gebruiker gedefinieerde typen, door de gebruiker gedefinieerde aggregaties, functies, procedures, triggers. Alleen ad-hocuitvoering met behulp van sp_execute_external_script.
DDL-ondersteuning CREATE ASSEMBLY om gebruikerscode te uploaden en andere objecten te definiëren (functies, procs, triggers UDTs, UDAggs). CREATE EXTERNAL LANGUAGEom EXTERNAL LIBRARY extensies en bibliotheken te beheren.
Bibliotheekondersteuning Bereikt via assembly's. Bibliotheken voor specifieke runtime kunnen worden gebruikt (bijvoorbeeld R- of Python-pakketten, Java-bibliotheken).
Ondersteunde runtimes .NET Framework R, Python, Java, C# of Bring Your Own Runtime (BYOR).
OSS-framework N.v.v. - kan worden uitgebreid via door de gebruiker gedefinieerde .NET-assembly's. Ja: extensie-SDK biedt het ontwerpen van nieuwe extensies of integratie met runtimes zonder enginewijzigingen.
QO-integratie Integratie op operatorniveau voor verschillende syntaxis, waaronder parallellisme. Eén externe scriptoperator voor het verzenden/ontvangen van resultaten en gegevens van runtimes, deze operator ondersteunt uitvoering van batchmodus en parallelle uitvoering.
Resourcebeheer Geen - weinig knoppen buiten resource governor. Biedt EXTERNAL RESOURCE POOL een object als een afzonderlijk mechanisme voor het beheren van resources die worden gebruikt door de runtime/externe scripts. Beleidsregels kunnen naast de SQL-workload worden gedefinieerd voor externe runtimes.
Machtigingsmodel Beheer op exemplaarniveau met db-bereikobjecten. Beheer op exemplaarniveau met db-bereikobjecten.
Performance SQL CLR-code presteert doorgaans beter dan uitbreidbaarheid vanwege de aard van de uitvoering. Ideaal voor batchgeoriënteerde uitvoering.
Bewakingsmogelijkheden sys.dm_clr* DMV's en beperkte SQL CLR-specifieke prestatiemeteritems. sys.dm_external* DMV's, DMV's voor externe resourcegroepen, Prestatiemeteritems voor Windows JobObject.

Wanneer gebruikt u elk

Of u nu taalextensies of CLR gebruikt, is afhankelijk van uw scenario's en doelstellingen. Als u het T-SQL-oppervlak bijvoorbeeld wilt uitbreiden met uw eigen aggregaties of typen, is CLR de beste keuze omdat type of aggregatie niet kan worden gedefinieerd met behulp van het uitbreidbaarheidsmechanisme. Als u daarentegen bestaande expertise op het gebied van data science in uw organisatie of team wilt gebruiken, is het gebruik van R/Python-integratie met uitbreidbaarheid de beste keuze.

Op dezelfde manier kunnen uw prestatiedoelen uw beslissing bepalen. Het implementeren van een regex-functie in C# en het gebruik van CLR is veel sneller dan het gebruik van uitbreidbaarheid om een Python-script aan te roepen dat dezelfde regex-functionaliteit uitvoert.