Data

6 out, 2009

Implementando Slowly Changing Dimension com o Microsoft Integration Services

Publicidade

Com este artigo, pretendo iniciar algumas matérias relacionadas ao Microsoft Integration Services, o ambiente da Microsoft para operações de ETL, com excelentes ferramentas para aplicações de BI. Hoje vamos analisar especificamente um componente do ambiente Integration Services, denominado Slowly Changing Dimension.

Slowly Changing Dimension é um termo utilizado em teorias de Data Management e Data Warehousing para grupos de dados lógicos como informações de produtos, clientes, etc que mudam lentamente ao longo do tempo.

Slowly Changing Dimension é bastante utilizado para armazenar alterações em informações que compõem um ambiente de Business Inteligence. Vamos imaginar que um ambiente de BI de uma rede de concessionárias de automóveis armazena informações sobre o histórico de vendas de seus vendedores. Aparentemente uma implementação fácil. Porém, vamos imaginar que um vendedor é transferido para uma filial em outra cidade, e agora precisamos implementar um relatório de vendas, agrupados por vendedores e filiais, comparando performance de vendas entre os vendedores. Se o vendedor foi transferido de uma filial com um mercado aquecido, para uma filial onde as vendas não são tão fáceis, podemos ter problemas, pois em uma análise comparativa entre vendedores, as vendas do vendedor transferido podem parecer absurdamente exageradas em comparação com os outros vendedores.

Para implementar o relatório com precisão é necessário armazenar a mudança de filial do vendedor e os períodos em que ele se manteve em cada filial.
Mas chega de papo, vamos implementar um exemplo de SCD com o Integration Services para que possamos entender melhor esta idéia.
Execute o script abaixo, que criará um banco de dados chamado Integração e uma tabela denominada clientes:

CREATE DATABASE Integracao
go

USE Integracao
go

CREATE TABLE Clientes (
id int identity(1,1) primary key,
Nome varchar(255) default NULL,
nuNivel varchar(50) default NULL,
Email varchar(255) default NULL,
Cidade varchar(50) default NULL,
ZipCode varchar(255) default NULL,
Endereco varchar(255) default NULL,
FlStatus varchar(255) default NULL,
DtNascto Datetime default NULL,
)
GO

E Execute o seguinte script para criar alguns registros em nossa tabela:

INSERT INTO Clientes (Nome,nuNivel,Email,Cidade,ZipCode,Endereco,FlStatus,DtNascto) VALUES ('Alan Bishop','9','ligula@amifringilla.org','Fallon','43398','P.O. Box 424, 3532 Cum Street','Divorced','09-08-29');
INSERT INTO Clientes (Nome,nuNivel,Email,Cidade,ZipCode,Endereco,FlStatus,DtNascto) VALUES ('Martin Valencia','5','aliquet@indolorFusce.org','Easthampton','07120','3498 Facilisis St.','Common-Law','09-02-26');
INSERT INTO Clientes (Nome,nuNivel,Email,Cidade,ZipCode,Endereco,FlStatus,DtNascto) VALUES ('Hamilton Bass','2','Phasellus.at@urnaet.edu','Midwest City','88438','8813 Lorem, St.','Single','10-07-15');

E agora, em nosso banco Integração, vamos criar uma tabela DIM_Clientes, que nada mais é que nossa tabela dimensão.

CREATE TABLE [dbo].[Dim_Clientes](
[idSchema] [int] IDENTITY(1,1) primary key,
[Current] bit,
[StartDate] datetime,
[EndDate] datetime,
[id] [int],
[Nome] [varchar](255) NULL DEFAULT (NULL),
[nuNivel] [varchar](50) NULL DEFAULT (NULL),
[Email] [varchar](255) NULL DEFAULT (NULL),
[Cidade] [varchar](50) NULL DEFAULT (NULL),
[ZipCode] [varchar](255) NULL DEFAULT (NULL),
[Endereco] [varchar](255) NULL DEFAULT (NULL),
[FlStatus] [varchar](255) NULL DEFAULT (NULL),
[DtNascto] [datetime] NULL DEFAULT (NULL))
GO

Repare que as duas tabelas têm estruturas bastante parecidas, porém nossa tabela dimensão tem alguns campos a mais: StartDate, EndDate.

Utilizaremos estes campos para armazenar os períodos em que nossos clientes tinham determinados dados.

Crie uma pasta na raiz do seu computador chamada TreinamentoSCD e depois abra o ambiente do SQL Server Business Intelligence Development Studio, e crie um novo projeto.

Nomeie este novo projeto como TreinamentoSCD, e clique OK. Verifique antes, se a opção “Integration Services Project” está criada.

Pronto! Nossa solution está criada, e agora podemos criar nossos pacotes DTS para importação, exportação e demais operações de ETL.

Na aba Solution Explorer, clique com o botão direito na pasta SSIS e adicione um novo pacote clicando na opção New SSIS Package e chame-o de SCD Clientes.

Na aba control flow, adicione um componente DataFlow. Nosso pacote deve estar assim nessa etapa:

Clique duas vezes no componente DataFlow que adicionamos, abrindo a aba Dataflow. Na aba DataFlow, selecione na ToolBox, um componente OLE DB SOURCE no menu Data Flow Sources. Clique duas vezes no componente, e crie uma nova conexão com seu banco de dados, informando o Server Name, usuário e senha, e não se esqueça de selecionar o nosso banco de dados integração, recém-criado, e a nossa tabela CLIENTES. Agora temos uma conexão em nosso projeto com o nosso banco de dados.

Clique novamente na aba ToolBox e selecione o componente Slowly Changing Dimension, e coloque-o no painel, conectando-o ao nosso “OLE DB Datasource”. Clique duas vezes no componente, abrindo suas configurações. A seguinte tela deve se abrir:

Selecione a tabela Dim_clientes, e clique na linha onde o campo Id está, e selecione o Key Type como Business Key. Isso habilitará o botão Next do Wizard. Clique em Next:

Na tela do Wizard que se abriu, adicione uma linha para cada uma das colunas da tabela Clientes e defina como Change Type, Historical Atribute. Clique em Next.


Selecione a opção “Use start and end dates to identify current and expired records”, e selecione para as opções Start Date e End Date as colunas StartDate e EndDate da nossa tabela DIM_CLIENTES criadas para este exemplo. Clique em Next, de-selecione a opção “Enable Inferred Member Support”, clique em Next e finalmente em Finish. No seu pacote, sua aba DataFlow ficará assim:


Execute o pacote, e depois faça um select na tabela DIM_CLIENTES. Verifique que os dados que estavam na tabela Clientes foram copiados para nossa tabela dimensão, e o campo StartDate tem a data da execução do pacote. Agora, faça um update no cliente com o Id = 1 alterando o seu ZipCode para 11111, e execute o pacote novamente. Execute o seguinte script:

select * from dim_clientes order by id

Verifique que um novo registro foi inserido na tabela DIM_CLIENTES, e o registro que já estava no banco de dados, agora está com o campo EndDate preenchido com a data da segunda execução.

No próximo artigo, implementaremos uma composição mais complexa com o STAR SCHEMA desenhado, utilizando uma tabela fato e outras dimensões.

Até a próxima!