Partilhar via


Comparar as extensões de linguagem do SQL Server com o SQL CLR

Aplica-se a: SQL Server 2019 (15.x) e versões posteriores

Este artigo compara as extensões de linguagem do SQL Server e o CLR (Common Language Runtime) nativo. Ele identifica as principais diferenças entre eles e ajuda você a decidir qual usar.

As Extensões de Linguagem do SQL Server são um recurso do SQL Server usado para executar código externo. Os dados relacionais podem ser usados no código externo usando a estrutura de extensibilidade.

O CLR (Common Language Runtime ) nativo permite implementar algumas das funcionalidades do SQL Server com linguagens .NET. O CLR fornece código gerenciado com serviços como integração entre idiomas, segurança de acesso ao código, gerenciamento do tempo de vida do objeto e suporte à depuração e criação de perfil.

Os idiomas disponíveis nas Extensões de Linguagem do SQL Server não substituem diretamente o SQL CLR. A estrutura de extensibilidade e as extensões de linguagem estendem a área de superfície do SQL Server e fornecem um ambiente de execução para tempos de execução mais próximos do mecanismo de banco de dados. Eles também fornecem uma estrutura de código aberto que pode ser usada para integrar novos tempos de execução sem alterações no mecanismo. Atualmente, a área de superfície está restrita ao procedimento armazenado do sistema, sp_execute_external_script.

A seguir estão algumas das principais diferenças entre SQL Language Extensions e SQL CLR:

Característica SQL CLR Extensões de linguagem SQL
Suporte à plataforma Windows & Linux - Linux suporta apenas SAFE assemblies. Windows & Linux - paridade total em termos de funcionalidade.
Modo de execução No proc Fora do proc
Isolamento O código CLR é executado dentro do processo do motor; O administrador da instância precisa confiar em todos os assemblies/código. A execução do tempo de execução está fora do processo do mecanismo. O isolamento adicional é fornecido usando Contêineres de Aplicativo no Windows ou Namespaces no Linux. A comunicação de rede externa também está desativada por padrão.
Sintaxe declarativa (T-SQL) Tipos definidos pelo usuário, agregações definidas pelo usuário, funções, procedimentos, gatilhos. Apenas execução ad hoc utilizando sp_execute_external_script.
Suporte DDL CREATE ASSEMBLY para carregar código de usuário e definir outros objetos (funções, procs, triggers UDTs, UDAggs). CREATE EXTERNAL LANGUAGE, EXTERNAL LIBRARY para gerenciar extensões e bibliotecas.
Apoio à biblioteca Alcançado através de montagens. Bibliotecas para tempo de execução específico podem ser usadas (Ex: pacotes R ou Python, bibliotecas Java).
Tempos de execução suportados .NET Framework R, Python, Java, C# ou Bring your own runtime (BYOR).
Estrutura OSS N/D - pode ser estendido por meio de assemblies .NET definidos pelo usuário. Sim - o SDK de extensão fornece criação de novas extensões ou integração com tempos de execução sem alterações no mecanismo.
Integração de QO Integração ao nível do operador para várias sintaxes, incluindo paralelismo. Único operador de script externo para enviar/receber resultados e dados de tempos de execução, este operador suporta execução em modo batch e paralelismo.
Governação dos recursos Nenhum - poucos botões fora do governador de recursos. Fornece EXTERNAL RESOURCE POOL objeto como um mecanismo separado para controlar os recursos consumidos pelos scripts de tempo de execução/externos, as políticas podem ser definidas para tempos de execução externos, além da carga de trabalho SQL.
Modelo de permissão Controle no nível da instância com objetos com escopo db. Controle no nível da instância com objetos com escopo db.
Performance O código CLR do SQL normalmente supera a extensibilidade devido à natureza da execução. Ideal para execução orientada a lotes.
Capacidades de monitorização sys.dm_clr* DMVs & contador de Monitor de Desempenho específico do SQL CLR limitado. sys.dm_external* DMVs, DMVs do pool de recursos externos, contadores do Monitor de Desempenho do Windows JobObject.

Quando utilizar cada seringa

Se você usa extensões de idioma ou CLR depende de seus cenários e objetivos. Por exemplo, se você precisar estender a área de superfície do T-SQL com suas próprias agregações ou tipos, o CLR é a melhor escolha, pois o tipo ou agregação não pode ser definido usando o mecanismo de extensibilidade. Por outro lado, se você quiser usar a experiência existente em ciência de dados em sua organização ou equipe, usar a integração R/Python com extensibilidade é a melhor escolha.

Da mesma forma, suas metas de desempenho podem determinar sua decisão. Implementar uma função regex em C# e usar CLR é muito mais rápido do que usar extensibilidade para invocar um script Python que executa a mesma funcionalidade regex.