P>

Clique aqui para ler todos os artigos desta edição
Aperfeiçoando o desempenho de uma agregação
Mauro Pichiliani
Como professor de banco de dados, um dos tópicos que mais gosto de ensinar em cursos introdutórios de SQL é o uso de agregações. Gosto deste assunto porque posso montar vários exemplos práticos que facilitam o aprendizado e fornecem uma boa base para ensinar conceitos da área de OLAP mais avançados.
Geralmente explico a necessidade de agregação de dados primeiro e depois sigo mostrando a sintaxe dos comandos e funções que fazem a agregação junto com exemplos práticos. Em uma das turmas, ao apresentar as poucas funções de agregações existentes, um aluno me perguntou:
- Professor, e se eu precisar fazer uma agregação que multiplica valores?
Respondi dizendo que os principais gerenciadores de bancos de dados do mercado não possuem uma função pronta que agregava valores através da multiplicação. A abordagem que sugeri para o aluno foi montar um algoritmo que utiliza um laço para varrer os dados e efetuar a multiplicação, sem utilizar os recursos de agregação do banco de dados.
Várias áreas de conhecimento possuem aplicações para a agregação que multiplica valores. Como exemplo podemos citar a estatística, que necessita da multiplicação de valores em seqüência para o cálculo de probabilidades, e a economia onde freqüentemente há a necessidade de aplicar a multiplicação de indicadores econômicos em uma série de valores.
Este artigo discute a implementação de soluções para a multiplicação de valores em uma agregação. Duas abordagens são apresentadas: a utilização de uma expressão matemática e a criação de uma função de agregação definida pelo usuário. Resultados experimentais do desempenho das duas abordagens, obtidos com o SQL Server 2005 Beta 2, são apresentados e comparados qualitativamente.
Agregando e multiplicando
As novas versões dos principais gerenciadores de bancos de dados líderes de mercado permitem o desenvolvimento de funções de agregações definidas por usuário através da integração com linguagens de programação ou pela utilização de dialetos do padrão SQL.
Apesar do recurso de criação de funções de agregação definidas por usuário, que vamos abreviar como UDAF (User Defined Aggregate Functions), nem sempre devemos utilizá-las para resolver todos os problemas de agregações complexas. Isto será demonstrado neste artigo através da comparação qualitativa do desempenho (tempo de execução) de uma UDAF que multiplica valores e de uma fórmula matemática para a multiplicação de valores em uma agregação.
A Listagem 1 apresenta o código fonte de uma UDAF programada com o novo .NET Framework 2.0, em C#. Já a Listagem 2 apresenta o script T-SQL que faz a importação desta UDAF para dentro do banco de dados Northwind, no SQL Server 2005 Beta 2.
/*
CLASSE CRIADA POR : MAURO C. PICHILIANI
DATA : 30/05/2005
DESCRIÇÃO: Classe Mult, que implementa a interface IBinarySerialize.
Esta classe cria uma User Defined Aggregate Function que multiplica dados.
Será importada para dentro do SQL Server 2005 Beta 2.
COMPILAÇÃO:
csc.exe /t:library
/r:"C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlaccess.dll"
/out:c:\Teste\Listagem1.dll c:\Teste\Listagem1.cs
REQUISITOS: Necessidade do .NET Framework 2.0 e o SQL Server 2005 Beta 2
*/
// Namespaces necessárias para a criação da UDAF
using System.Data.SqlServer;
using System.Data.Sql;
using System.IO;
using System.Net;
[SqlUserDefinedAggregate( // Atributo de classe necessário para a criação de uma UDAF
...