Category Archives: BI

Erro no BIDS – Digital Signature

Hoje cedo ao tentar abrir meu BIDS, na verdade um projeto de SSIS me deparei com o erro:
“Could not load type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSPackageSigning100’ from assembly ‘Microsoft.SqlServer.DTSRuntimeWrap, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91′”

Ta…Ao pensar um pouco sobre o que poderia ser, em primeira instancia ja imaginei projeto corrompido…Fui tentar abrir um outro e tive o mesmo erro, reiniciei a maquina (Estava a umas 3 semanas ligadas) e tive o mesmo erro…fui tentar criar um novo projeto…e mesmo erro…Pesquisando um pouco sobre o erro cheguei a seguinte solução:

“Deschecar” essa opção no BIDS antes de abrir o projeto:
Tools – Options – Business Intelligence Designers – Integration Services Designers – General – “Check digital signature when loading a package”

Feito isso consegui abrir normalmente o projeto ou criar novos.

Como habilitar erros remotos no SSRS (Report Server)

Para se habilitar erros remotos no SSRS, ou seja, quando uma aplicação chama através do web service uma renderização de um arquivo do reporting service e o mesmo gera um erro, apenas com erros remotos habilitados no SSRS que será possivel em aplicação ver o mesmo no exception.

1 – Crie um arquivo chamado: “EnableRemoteErrors.rss”

2 – Dentro deste arquivo coloque o seguinte conteudo:
Public Sub Main()
Dim P As New [Property]()
P.Name = “EnableRemoteErrors”
P.Value = True
Dim Properties(0) As [Property]
Properties(0) = P
Try
rs.SetSystemProperties(Properties)
Console.WriteLine(“Remote errors enabled.”)
Catch SE As SoapException
Console.WriteLine(SE.Detail.OuterXml)
End Try
End Sub

3 – Execute via commando line no prompt:
rs -i D:\EnableRemoteErrors.rss -s http://IpOuHostNameDaInstanciaSSRS/NomeConfiguradoNoSSRSManager

Erro DTS Designer SQL Server Management Studio 2008 – SQL Server 2000 DTS Designer components are required to edit DTS packages. Install the special Web download, “SQL Server 2000 DTS Designer Components” to use this feature.

Ainda me surpreende em pleno ano de 2013, com o SQL Server 2012 já estável e um service pack lançado alguns lugares estarem ainda com o SQL Server 2000, não entrarei em detalhes do por que disso (Custo de mudança, licença, pessoas, hardware…Enfim!) mas de vez em quando temos de aceitar o fato com as coisas que temos de lidar. Ontem precisei fazer algumas alterações em um pacote DTS, Sim! DTS e não DTSX.

O primeiro passo a ser feito é ter o designer de pacotes DTS em sua maquina, aqui eu só tinha uma versão Enterprise do SQL Server 2008R2 tanto em relação Database Engine como em relação as ferramentas (Business Inteligence Development Studio e SQL Server Management Studio) o que faz com que o primeiro passo seja baixar tal designer. O mesmo pode ser obtido neste link: Aqui

O arquivo especifico que baixei foi o: SQLServer2005_DTS.msi de 5.0MB

E realizei a instalação do mesmo, conforme solicitado fiz um reboot na maquina e para minha surpresa ao tentar pelo SQL Server Management Studio -> Management -> Legacy -> Data Transformation Services -> Botão direito do mouse -> Open Package File, eu tive o erro abaixo:

SQL Server 2000 DTS Designer components are required to edit DTS packages. Install the special Web download, “SQL Server 2000 DTS Designer Components” to use this feature. (Microsoft.SqlServer.DtsObjectExplorerUI)SSMS

Ou seja, mesmo depois de instalado o erro de que o componente não foi encontrado persistia…. Depois de algumas tentativas frustradas de solução e muita pesquisa, encontrei o maravilho link cujo qual foi a solução do meu problema.

Uma solução simples, mas que talvez seja difícil de ser encontrada a força por uma pessoa de banco de dados…

A solução consiste em uma simples alteração de uma variável de ambiente do windows. No meu caso estou utilizando o windows 7 e os passos foram os seguintes:

1 – Abrir o painel de controle
01

2 – Clicar em “Sistemas e segurança”
02

3 – Clicar em “Sistema”
03

4 – Clicar em “Configurações avançadas do sistema”
04

5 – Ir para a aba “Avançados” e clicar em “Variáveis de ambiente”
05

6 – Buscar a variável “Path”
06

7 – E alterar seu conteúdo de forma que a linha

C:\Program Files (x86)\Microsoft SQL Server\80\Tools\Binn\;

Fique acima da linha

C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;

Ou seja, em minha maquina o conteudo da mesma estava:

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Intel\DMIX;
C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;
C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;
C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;
C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\;
C:\Program Files (x86)\Microsoft SQL Server\80\Tools\Binn\;
C:\Program Files (x86)\Borland\StarTeam SDK 11.0\Lib;
C:\Program Files (x86)\Borland\StarTeam SDK 11.0\Bin

E foi alterado para:

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Intel\DMIX;
C:\Program Files (x86)\Microsoft SQL Server\80\Tools\Binn\;
C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;
C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;
C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;
C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\;
C:\Program Files (x86)\Borland\StarTeam SDK 11.0\Lib;
C:\Program Files (x86)\Borland\StarTeam SDK 11.0\Bin

Grupos no SSRS (SQL Server Reporting Services)

Uma duvida que vejo bastante em foruns e nos emails com duvidas que recebo sobre SSRS (SQL Server Reporting
Services) é em relação a agrupamento, ok, porem, o que é agrupamento…?

Sabe quando uma linha se repete varias vezes, sendo o topo maximo de uma hierarquia, e as diferencas da linha estão em niveis mais baixo, como por exemplo: Estado e cidade, teriamos algo assim…

SP São Paulo
SP Campinas
SP …
RJ …
RJ …

Ou seja, podemos observar que o estado esta aparecendo varias vezes!, o que obviamente fica bem feio, e ruim de ser lido em um relatorio, portanto, a tecnica de agrupamento não só é extremamente pratica e simples de ser aplicada, como em muito casos, simbolo de boa pratica e higienização visual em seu relatorio.

Como curiosidade, ao criarmos um grupo, estamos falando de hierarquia, a mesma que pode ser feita no SSAS (Que sera assunto de posts futuros…).

Abaixo, segue uma breve explicação de como se criar estes grupos (Hierarquias no SQL Server Reporting Services).

OBS: Estou utilizando BIDS 2008, com SQL Server 2008, e uma base chamada AdventureWorksLT, é basicamente a base AdventureWorks que ja conhecemos bem, porem em sua versão Lite, sendo mais leve, e com menos tabelas.
A tabela que utilizarei como exemplo, se chama Product, que contem informações dos produtos que são vendidos na famosa loja de bicicletas.

Passo 1: Criar a conexão com a base de dados e um novo relatorio

Neste passo, não tem segredo, se iniciarmos o BIDS no modo de contrutor de relatorio, muito provavelmente ja ira te saltar uma opção Wizard para informar uma conexão e um relatorio, como o foco deste post não é o desenvolvimento inicial de relatorios, irei abstrair este passo, qualquer duvida no mesmo, fique a vontade para me mandar email ou perguntar nos comentarios.

Passo 2: O Objeto

O objeto que utilizaremos para se criar os grupos se chama Tablix, basta arrastar da caixa de ferramenta, um deste objeto para seu relatorio.

Passo 3: Criação de um DataSet com o SELECT no banco de dados

Aqui, basta criar um novo DataSet, utilizando a conexão previamente criada, e escrever seu SELECT, no meu exemplo, estou utilizando:

SELECT ProductCategoryID, Name
FROM SalesLT.Product
WHERE ProductCategoryID IN (9, 10)

O filtro, é apenas para ficar visualmente mais limpo, tendo em vista que o ponto do post não é a analise de dados, e sim o agrupamento dos mesmos.

Feito isso, fica bem simples o agrupamento, abaixo de seu relatorio, deve ter os campos:
– Grupos de linhas
– Grupos de colunas

Como temos os dados no formato exemplificado acima, e queremos deixa-lo…

SP São Paulo
Campinas
RJ …

Iremos utilizar o agrupamento de linhas.

Então, basta voce selecionar o campo mais alto de sua hierarquia, que no nosso caso é o ProductCategoryId, e arrasta-lo para o grupo de linhas, e em seguida, ir descendo o nivel de sua hierarquia, portanto, arrastando tambem, o campo Name, como na imagem abaixo:

Com o intuito de melhor visualização e como não temos nenhum outro dados, estou setando a ultima coluna com visibilidade oculta, aqui, seria interessante colocar por exemplo, o total, um grafico por linha e afins, as possibilidades são infinitas.

Então, teriamos uma visualisação mais ou menos assim:

Criando o SLD (Slowly Changing Dimension) manualmente para ganho de performance ou para BIDS 2005

Continuando o post sobre transferencia de dados pela ferramenta SSIS (SQL Server Integration Service), neste irei comentar não só sobre a carga de dados evitando erro de primary Key, mas sim, atualizar os outros campos caso tenha ocorrido alguma alguma alteração.
Por exemplo, neste post eu explico sobre apenas evitar erro de PK, portanto, imaginem o seguinte cenario:

Tabela Lojas Servidor OLTP:
1 56 Nome fantasia1 Responsavel 1 Cidade 1
2 78 Nome fantasia2 Responsavel 2 Cidade 2

E na tabela Lojas do Servidor OLAP, temos:
1 56 Nome fantasia1 Responsavel 1 Cidade 1

Se seguirmos apenas o primeiro post, veremos que a segunda linha sera sim transferida, e a primeira não, evitando assim o erro de Primary Key, porem, e caso a primeira linha do servidor OLTP fosse:
1 56 Novo Nome fantasia1 Responsavel 1 Cidade 1

Essa alteração não seria feita no servidor OLAP, mantendo assim para a primeira linha o nome fantasia “Nome fantasia 1”.

Enfim, essa é uma tarefa muitas vezes necessario aonde percebo que muitas pessoas possuem muitas duvidas.

No SQL Server 2008 temos a opção de utilizar um componente chamado Slowly Changing Dimension, porem não é a toa que ele possui este nome, esse componente é extremamente facil e simples de se configurar, alem de fazer todas essas alterações que eu descrevi acima alem de algumas variações de opções como manter historico ou atualizar, o problema é que ele é muito lento, para tabelas dimensões por exemplo, aonde este ambiente é vivido diariamente, a utilização deste trara facilidade na criação do ETL, porem dores de cabeça em sua execução, claro que essa queda de performance só sera sentida efetivamente com grande numero de dados.

A melhor opção seria criar manualmente este componente, abaixo esta descrito passo a passo de como realizar essa tarefa, para que no exemplo acima, a linha 1 seja atualizada e a linha 2 seja inserida.

Explicação do meu Cenario:
– Estou utilizando como Data Source um Excel, aonde a alteração de dados para confirmação do processo fica mais facil.
– O Dados extraido do excel vem como NVARCHAR, no caso minha tabela destino ja esta como NVARCHAR, porem o campo do numero da loja esta como int na tabela, sendo necessario colocar um “Data Conversion” após a extração do excel.
– Estou utilizando o BIDS 2005, talvez no 2008 as telas sejam um pouco diferente, alem do look up contem a opção de “Row not Match”, utilize-a se estiver no 2008, fica um pacote mais limpo e facil de ser entendido do que configurando a saida de erro do Look Up para linhas que não baterem.

Visão geral dentro do “Data Flow Task”

Explicação de cada Task:

EXCEL LOJAS: Aqui temos um simples Data Source com excel, não texistem grandes detalhes, apenas criação da conexão com o arquivo e selecionado todas as colunas, como meu excel não possui nome das colunas no arquivo, estou colocando um alias para cada coluna do excel, conforme foto abaixo:

Conversão chave de negocio: Aqui temos, como descrito acima, uma simples conversão devido a captura de dados do excel.

Bate Chave de Negocio (Numero_LOJA): Conforme descrito aqui esta apenas batendo as PKs, que neste caso tambem é a chave de negocio, para ver se ja
existe ou não, as possibilidades de saida são 2:
1. Não existe, inserção simples (Seta vermelha)
2. Existe, atualiza outros campos (Seta verde)

Os prints deste objeto estão no outro post.

OLE DB Command: Aqui esta a novidade deste post, como explicação deste objeto do Integration Service, é possivel dizer que este, ira realizar um comando SQL para cada linha que entrou nele, sim, a explicação é meio abstrata, talvez com o exemplo abaixo, conforme ordem de execução e não sequencial de abas, fique mais claro.

1. Connection manager
Aqui voce apenas ira especificar qual a conexão aonde o comando TSQL sera executado, no meu exemplo, na base de dados aonde esta a tabela Loja.

2. Input and Output Properties
Voce deve obviamente configurar entradas e saidas para este componente, ou melhor dizendo, uma coluna de entrada (Que veio dos objetos previos) para uma variavel de utilização local. Lembrando tambem que o nome de cada variavel local deve ser Param_, sendo de 0 a N.

Em OLE DB Command Input -> External Columns, iremos configurar essas variaveis, conforme imagem abaixo, existem 2 configurações que voce deve prestar atenção:
– Nome, conforme descrito acima: Param_0, Param_1, Param_2, Param_3.
– Data Type, deve ser o mesmo do tipo de dados da coluna que esta entrando no componente.

3.Column Mapping
Aqui voce ira mapear cada “variavel” local que voce criou o Step 2 para uma entrada, veja que aqui temos todas as opções, assim como o numero da loja sendo NVARCHAR (Direto do EXCEL) e o como INT, convertido previamente. Em meu exemplo, ficou desta maneira:

4.Component Properties
Por fim, a ultima aba de configuração, e o script SQL a ser executado, aqui voce devera primeira configurar a opção “Validate External meta Data” para true, para verificação das colunas de entrada, o default timeout, voce pode até configurar, mas não creio que seja tão usual assim, 0 representa sem timeout, o default code page tambem não é necessario alteração, deixando-o como 1252.
Em SQL Command, iremos colocar nosso comando SQL Server a ser executado para cada linha, no meu exemplo esta:

UPDATE Loja
SET Nome_Fantasia = ?,
Responsavel = ?,
Cidade = ?
WHERE Numero_Loja = ?


Ou seja, na base espeficada pela conexão na primeira aba deste componente, ira atualizar a tabela loja, aonda o Numero_loja seja igual ao Param_3, que é o

ultimo configurado, e no caso, nossa unica chave de negocio, os 3 primeiros “?” representam reespectivamente as “variaveis” locais Param_0, Param_1 e Param_2, que foram mapeadas no step 3 deste componente.

Considerações finais

Como puderam observar, é um trabalho não muito simples, e talvez até para niveis mais avançados em Integration Service, mas o ganho de performance faz todo o trabalho valer a pena.
No exemplo acima, foi feita a configuração dos componentes de forma a simular o Slowly Changing Dimension quando o mesmo for configurado para não manter historico e nem deixar dados fixos, caso sua intenção seja a realização dessas configurações, porem de forma manual e mais performatica, basta colocar regras como IF em seu comando SQL, é possivel executar procedures tambem apenas informando os dados, mas lembre-se que essa ação sera feita por linha, caso sua procedure seja muito grande e tenha muitas instruções, todo o motivo dessa alteração, ganho de performance, pode se perder.

Espero que este post possa ajudar muitas pessoas a realizarem tunnings em seus ETL de BI uma vez que normalmente trabalha-se com uma grande quantidade de dados.

Tratando erro de Primary Key em inserções via SSIS Data Flow (Integration Services)

Estou fazendo este post para ajudar um amigo do forum microsoft TechNet Bruno.Costa, a duvida referente é sobre como transferir dados diariamente pelo Integration Service (SSIS), sem dar erro de Primary Key, ou seja, não transferindo todos os dados.

Configurando o pacote

1 – Conexão com a base de dados (No caso estou utilizando apenas uma)

2 – Data Flow Task

3 – Visão Macro de dentro do Data Flow

Lembrando que aqui as configuraçõs estarão no Look Up, portnto o objecto Source E Destination, não possuem nenhuma configuração a não ser apontamento de tabelas.

4 – Loop Up

Quando voce apontar de uma task de data source para um Look up, pense que voce ja tem em mãos a tabela source, portanto, na primeira tela do Look Up voce deve apontar para a tabela destino, no caso do meu exemplo, ficaria como a imagem abaixo:

Em Coluns, voce deve apenas linkar as Primary Key de cada tabela, conforme abaixo:

Agora, o look up serve como um join, portanto, ele ira verificar se o ID da tabela Source ja existe na tabela Destiny, portanto, se voce utilizar a seta verde na saida do look up para o destination, voce ira apenas tentar inserir dados que ja existem, e ira surgir um erro de violação de primary key, portanto, voce deve configurar a saida de erro para redirecionar as linhas, na aba Columns ainda no Look Up, clique no botão na parte de baixo da task chamado “Configure error Output…” e configure conforme figura abaixo:

E lembre-se de utilizar a seta vermelha para o destination conforme imagem geral dentro do Data Flow.

Conexão dinamica no SSIS

Como muitas pessoas ja devem ter percebido, apesar do trabalho de
DBA, ultimamente tenho utilizado bastante o combo de BI do SQL Server, no caso, Integration Services (SSIS),
Analisys Service (SSAS) e Reporting Services (SSRS).
Como realmente não tinha uma experiencia tão vasta nos mesmos, descobri muitas coisas, alguma da forma mais
facil, outras das mais dificeis.
Um item que ao ter a necessidade e buscar na internet, tive muitas dificuldades de encontrar, foi como parametrizar
de forma dinamica um conection source, seja ele um caminho de um arquivo adicionado do nome do arquivo, como de um servidor e uma base.
Muitas maneiras que encontrei eram bem “HardCore”, tendo que mexer inclusive em programação interna das tasks, depois de mexer um pouco, descobri uma maneira muito mais simples:

Cenario:
Vamos supor que temos um arquivo capturado de um FTP, porem toda hora, temos um nome diferente, então neste cenario, não conseguiriamos fixar uma conexão, o caminho do arquivo, neste cenario sim, mas não o nome.
Bom, a opção mais simples para se realizar essa tarefa depende de alguns passos, que estão listados abaixo:

1 – Encontrar o nome do arquivo.
Não importa qual dinamico seja seu ETL, ainda sim é preciso, obviamente, conhecer qual o arquivo de fonte a ser lido, portanto, como primeiro passo, é criar uma task “SQL Task”, que retorne o nome do arquivo, seja ele capturado da maneira que achar melhor (Eu gosto, apesar dos buracos de segurança caso não utilizado com cautela, de utilizar o xp_cmdshell)

2 – Armazenamento persistente durante execução.
Claro que voce não pode simplismente retornar esse valor e pronto, é necessario grava-lo em algum lugar, portanto, crie uma variavel conforme abaixo, e coloque o result set do Passo 1 para linha simples e jogue-o nesta variavel.

3 – A configuração em si.
Agora, vamos a configuração, primeiro de tudo, crie uma conexão para um arquivo texto qualquer, claro que iremos cortar o passo do caminho, caso este primeiro arquivo de configuração ja esteja no caminho correto.
Com uma conexão fixa ja configurada, para a tornarmos dinamica é bem simples, basta clicar na conexão dentro de Gerenciadores de Conexões, no quadro de propriedades, clique em Expression, teoricamente não tera nada, portanto, clique em “…” e ira aparecer uma tela denominada “Editor de Expressões de Propriedades”, aqui, podemos configurar todos os parametros de uma conexão, como por exemplo caminho, nome do arquivo, usuario de autenticação, entre outras….

As opções de caminho e arquivo:
Nos quadrados a esquerda temos qual parametro da conexão queremos configurar, ja no quadro a direita, qual o valor, é possivel fixar um valor, ou colocarmos uma variavel (No caso, a que obtemos no step 1 e 2)
Name é o nome do arquivo, no caso do nosso exemplo portanto, a variavel sera configurada para este.

Agora, se estivermos falando de uma base de dados aonde a base ou o servidor devam ser dinamicos, é necessario uma modificação do Step 1 e 2, porem agora ao invez de buscar o nome do arquivo, é necessario buscar o servidor e a base, porem o processo de jogar em uma variavel se mantem.
Para conexões com base SQL Server, em Propriedades -> Expression temos:
Initial Catalog sera a base de dados utilizada, basta colocar aqui a variavel que contem sua base.
Server Name sera utilizado para indicar qual o servidor da conexão.

Configurando a primeira vez um Reporting Services (SSRS)

Devido ao crescente numero de duvidas em relação a configuração do Reporting Services, estou criando este post, que esta bem simples, de como se configurar o SSRS de forma facil, sem muitas alterações.

Este post tem como ponto de partida, o step seguinte após a instalação do SSRS em um servidor, portanto, como pre requisito para o acompanhamento deste post é necessario:
– Conta com alta permissao no ambiente windows
– Conta com alta permissao no SQL Server
– SQL Server Database Engine instalado (Instancia, pode ser remota….)
– SQL Server Reporting Services

Tendo todos em mãos, vamos ao passo-a-passo:

Ao se abrir o Reporting Services Configuration Manager conforme foto abaixo:

Temos muitas opções a esquerda, mas para o funcionamento padrão nem todas são necessarias se configurar, portanto, como este passo-a-passo tem como usuario foco pessoas iniciantes, não creio que seja necessario entrar nesses detalhes.

Passo 01: Se Conectando

Aqui voce simplismente ira se conectar em uma “instancia” do Reporting Services, lembrando que o serviço do mesmo deve estar ativo em Executar -> Services.msc

Passo 02: Visão geral do status do serviço

Aqui voce simplismente tem uma visão de como esta seu serviço do Reporting Services, esteja certo que o mesmo esta iniciado com o status Running.

Passo 03: O repositorio interno

O Reporting services trabalha com basicamente 2 “pastas” (Diretorios), sendo eles um virtual (Interno de proprio controle do SSRS), e o externo, que é o qual os administração utilizarão para administrar as pasta e relatorios.

Passo 04: O repositorio administrativo

Aqui temos o link do repositorio que sera utilizado para a administração do mesmo.

Passo 05: O usuario Windows

Aqui é possivel especificar o usuario que sera utilizado no serviço do SSRS.

Passo 06: O usuario do Pool no IIS

Como o SSRS é uma ferramenta web, não seria normal se ele não utilizasse o IIS, portanto, aqui temos o usuario e o pool de aplicação que ele ira utilizar.

Passo 07: A base de dados do SSRS

O SSRS tambem utiliza uma base SQL Server comum, portanto neste passo, é necessario espeficar a base que ele ira utilizar, é possivel aqui mesmo criar uma base caso necessario, lembrando que duas bases serão criadas, uma com o nome especificado, e outra com o mesmo nome acrescentado de Temp, alem de especificar o usuario que sera utilizado na autenticação da base.

Agora, se todas as configurações acima estão OK, seu SSRS deve estar funcionando, para testar o acesso, basta ir em:
http://HostName/NameApontadoNaAbaDoRepositorioAdministrativo

Aqui neste link, tem um outro post meu sobre como realizar o deploy de um report project em um SSRS ja configurado

Modelagem Estrela

Quanto falamos de um ambiente OLTP, ou seja, aquele ambiente, aquela instancia, aquelas tabelas, que são utilizadas para procedimento normais do dia-a-dia, estamos falando de um ambiente normalizado, mais comum na terceira ou quarta normal formal, uma vez que chegar até a quinta possa ser exagero.
Porem, realizar analise de dados em um ambiente OLTP pode ser muito custoso, pois ficar fazendo o relacionamento de muitas tabelas pode ser um custo talvez desnecessario para essa instancia SQL Server, ai que entra os ambientes OLAP e modelagem desnormalizada.
Um ambiente OLAP é um ambiente preparado para analise de dados, então basicamente temos 2 operações nesse ambiente
– Inserção de dados em massa
– Muitos selects
Ja em um ambiente OLTP:
– Muitas pequenas inserções de dados
– Alterações
– Deleções
Todos sabemos que operações DML sofrem com o abuso de indices que algumas tabelas possuem, portanto, com certeza teremos muitos mais indices em nosso ambiente OLAP (Que sera para select basicamente) do que em nosos ambiente OLTP.
Algumas dicas para melhora de performance na inserção de dados em ambiente OLAP:
– Uma tecnica que traz muita performance mas se torna inviavel em um ambiente OLTP, é a utilização de discos em RAID0, cujo qual não te da nenhuma garantia dos dados, ja em um ambiente OLAP, é possivel sim, vamos supor um exemplo:
Em um ambiente OLAP, nenhum dado é novo, todos ja vem de nosso ambiente OLTP, portanto, podem-se teoricamente perder os dados, basta se reprocessar, e na pior das hipoteses, um ambiente OLAP por algumas horas (Restore de um backup previo ao crash) não é tão critico quanto o ambiente OLTP fora.
– Antes da inserção: Desabilitar os indices e depois reabilita-los
– Não colocar valores muito pequenos no auto-growth do seu arquivo de dados e de log, pois toda vez que uma inserção for feita, o SQL Server precisara pedir ao sistema operacional mais disco, o que pode causar uma imensa queda de performance.

Voltando ao assunto principal do post: o Ambiente estrela.
Se formos pensar literalmente em uma estrela temos basicamente um centro e suas pontas, ou seja, temos um ponto unico e central que esta ligando todas as pontas, porem, uma ponta não possui ligação com a outra.
Nessa linha de pensamento, temos nossas tabelas FATO e nossas TABELAS DIMENSÕES, no caso, nossa tabela central, que liga todas as outras, são nossa tabela fato, ja as tabelas que seriam a ponta da estrela, são nossas tabelas dimensões.

Como explicação das tabelas fatos e dimensões:
FATO: Uma tabela FATO possui a menor granularidade necessaria para um relatorio, ela é constituida de muitas chaves estrangeiras, nenhuma chave primaria, e representam uma verdade em seu negocio, como por exemplo uma venda.
DIMENSÕES: Uma tabela DIMENSAO possui uma chave primaria unica, e muitos atributos e linhas, elas são uma extensão de alguns dados de sua tabela FATO, vamos supor: uma venda, ocorreu em algum lugar, por alguem, só aqui podemos ter uma dimensão de Loja e uma de Clientes.

Voces talvez percebam que em uma modelagem estrela de BI, havera sim muitas repetições de dados, e isso não é ruim, com certeza voce tera uma maior utilização de seu espaço em disco, em compensação, sua querys trarão um retorno de forma mais rapida.

Indices em modelagem estrela
Como ja era de se imaginar, em um ambiente de relatorio, usamos muitos indices, porem, temos que tomar cuidado, pois não é simplismente colocar indices em todas as suas tabelas e pronto, como ponto inicial, eu diria que alem do indice Cluster em suas tabelas DIMENSÕES devido a primary key, sera necessario um indice em cada chave de negocio, ou seja, Bussiness Key, aquele campo que é constantemente utilizado por seus usuarios de negocio, por exemplo:
Um indices cluster na coluna ID de loja, porem um usuario de negocio, não sabe o ID da loja, e sim o nome dela, ou o numero da filial, enfim, é necessario criar um indice no campo, pelo qual um usuario de negocio saiba realmente pesquisar.

Bus Architeture

Hoje depois de alguns dias conturbados, estou voltando a escrever para meu blog, nesse meio tempo, me dediquei muito ao aprendizado de BI, estou atualmente lendo o livro do Ralph Kimball, que por sinal é um ótimo autor, não encontrei o livro em portugues, então posso dizer com certeza que o proprio Ralph Kimball é muito didatico em seus ensinamentos.
Queria deixar claro tambem que não sou especialista em BI, gosto, e estou aos poucos me envolvendo na area, mas a minha area de atuação e cuja qual eu possuo conhecimento é de administração e desenvolvimento.
Porem, uma das duvidas mais comuns no parado forum de analysis server aqui do TechNet Brasil, é que se uma dimensão pode ser utilizada mais de uma vez, bom, a resposta curta é sim, o por que disso é que em um cenario estrela, voce possui a sua tabela fato e ao redor dela todas as suas dimensões, como mostra a imagem a seguir.

Veja que no exemplo possuimos 2 tabelas fato e 3 tabelas de dimensões.
Note tambem que não necessariamente todas as tabelas fatos devem ter relacionamento com toda as tabelas de dimensões.
Podemos exemplificar todo esse cenario de BI em apenas uma imagem de arquitetura onibus (Bus Architeture), veja imagem a seguir:

É possivel tambem se criar a matriz de relacionamento entre as tabelas fatos e suas dimensões, como mostra a proxima imagem:

Data Clientes Produto
Estoque x x
Vendas x x x

Caso voce queira reutilizar suas tabelas dimensões, voce deve tomar cuidado com algumas coisas:
1. A granularidade maxima das tabelas dimensões deve atender a granularidade maxima de todas as tabelas fato relacionadas.
2. Neste caso voce possui a vantagem de não ocorrer desperdicio de espaço com a duplicação de dados da tabela fato.
3. Como ponto negativo é possivel colocar que suas tabelas dimensões ficarão muito maiores, o que pode fazer com que seja necessario esforços administrativos para garantir a performance desejada