Published on

August 11, 2022

Compreendendo o Impacto de Desempenho de Colunas Calculadas com Funções Escalares no SQL Server

No SQL Server, Colunas Calculadas e Funções Escalares Definidas pelo Usuário nem sempre se dão bem. Muitos desenvolvedores de banco de dados reclamam do desempenho de Colunas Calculadas que usam uma Função Escalar para determinar seu valor. Neste artigo, investigaremos o segredo por trás dessa relação ruim.

Visão Geral da Coluna Calculada no SQL Server

Uma Coluna Calculada é um tipo especial de coluna cujos valores são calculados usando uma expressão que inclui valores constantes, funções, dados de outras colunas na mesma tabela ou uma combinação desses componentes conectados por um ou mais operadores. A Coluna Calculada é uma coluna virtual, com seu valor calculado e não inserido diretamente pelo usuário. Cada vez que a coluna é referenciada em uma consulta, ela é armazenada na memória sem ser armazenada fisicamente na tabela, a menos que a coluna seja definida como uma coluna PERSISTED. A Coluna Calculada facilita a vida dos desenvolvedores, fornecendo a lógica de cálculo na camada do banco de dados, em vez de calculá-la na camada de aplicativo.

Para definir uma coluna calculada como PERSISTED, ela deve ser determinística, o que significa que a expressão usada para calcular os valores da coluna calculada deve retornar o mesmo resultado sempre que for chamada com um conjunto específico de valores de entrada no mesmo estado do banco de dados. Se a coluna calculada for definida como PERSISTED, os valores da coluna serão atualizados automaticamente quando qualquer coluna que participe da expressão da coluna calculada for alterada, reduzindo a sobrecarga de calcular os valores da coluna calculada em tempo de execução. Além disso, definir a coluna calculada como PERSISTED permite criar um índice nessa coluna para acelerar as consultas que acessam a coluna calculada.

Visão Geral da Função Escalar Definida pelo Usuário

Uma Função Definida pelo Usuário no SQL Server é um conjunto encapsulado de comandos T-SQL que aceita parâmetros, realiza alguma ação ou cálculo e retorna o resultado dessa ação como um valor, ocultando a complexidade lógica da camada de aplicativo e tornando-a reutilizável. O SQL Server nos fornece dois tipos de funções definidas pelo usuário: a função de tabela, também conhecida como TVF, que retorna o resultado na forma de uma tabela e pode ser usada na cláusula FROM da consulta, e uma função escalar que retorna um único valor de dados do tipo definido em uma cláusula RETURNS. Além da forma do resultado, os dois tipos de funções definidas pelo usuário diferem um do outro na forma como são tratados internamente pelo otimizador de consultas. A função escalar será executada uma vez para cada linha no conjunto de resultados, onde o SQL Server chamará a função de tabela uma vez, independentemente do número de linhas a serem processadas.

Coluna Calculada com Função Escalar

Um erro de design comum é encapsular a lógica de cálculo da Coluna Calculada usando uma função escalar definida pelo usuário, pois isso impedirá que as consultas enviadas a essa tabela se beneficiem do recurso de paralelismo, independentemente do valor do Grau Máximo de Paralelismo ser definido como 0 ou um valor maior que 1 e o custo da consulta exceder o valor configurado do Limiar de Custo para Paralelismo.

Para demonstrar esse problema, vamos criar duas tabelas com Colunas Calculadas para visualizar a renda anual do funcionário. A renda anual na Coluna Calculada da primeira tabela será calculada usando uma expressão direta fornecida na instrução CREATE TABLE. Além disso, será criado um índice não clusterizado nessa Coluna Calculada para acelerar a pesquisa com base nessa coluna. Na segunda tabela, a coluna calculada calculará a renda anual passando o valor do salário do funcionário para uma função escalar.

Quando comparamos o desempenho da consulta dessas duas tabelas, podemos ver que a consulta da primeira tabela, que possui uma coluna calculada calculada sem usar uma função escalar, é mais rápida e consome menos tempo de CPU do que a consulta da segunda tabela, que possui uma coluna calculada calculada usando uma função escalar. Isso ocorre porque o uso da função escalar impede que a consulta use um plano de execução paralelo, resultando em um desempenho mais lento.

É importante estar ciente desse impacto no desempenho ao projetar e implementar Colunas Calculadas no SQL Server. Se possível, evite usar funções escalares em Colunas Calculadas para garantir um desempenho de consulta ideal.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.