Mostrando postagens com marcador SSIS. Mostrar todas as postagens
Mostrando postagens com marcador SSIS. Mostrar todas as postagens

quarta-feira, 6 de março de 2013

Variável Decimal no SSIS 2012

Já faz alguns dias que eu estou andando de mão dada com o Integration Services 2012, gravando uma série de módulos para um treinamento completo de SSIS. Em breve vocês poderão ver as publicações nos treinamentos on-demand (http://www.srnimbus.com.br/calendario/turmas/treinamentos-on-demand/).
Uma questão interessante que destaquei em um dos vídeos é a variável do tipo Decimal, que não existia na interface do SSIS 2008 e está presente no SSIS 2012. Utilizando como base os testes que realizei, a não definição correta das características dessa variável pode trazer efeitos colaterais indesejados para seus pacotes.
Vou descrever alguns testes para que você possa simular no seu ambiente:
1.       Adicionar uma variável do tipo Double chamada vDouble (criativo, não?) ao pacote.
2.       Adicionar uma expression task com a seguinte expressão: @[User::vDouble] = 43 / 3
a.       Analisando o valor da variável após a expressão: 14
b.      Para termos um valor inteiro como resultado da divisão é porque estamos tratando dois inteiros como divisor e dividendo, então pela precedência dos tipos o resultado também é um valor inteiro.

3.       Alterar a expression task com a seguinte expressão: @[User::vDouble] = ((DT_DECIMAL, 4) 43) / 3
a.       Notem que estou fazendo a conversão do número 43 para DECIMAL com escala 4. No SSIS o tipo decimal possui precisão 29, diferente do tipo DT_NUMERIC (usando no pipeline) onde você pode definir até 38 como precisão.
b.      Analisando o valor da variável após a expressão: 14.3333333333
c.       Agora sim, o valor resultante possui casa decimal pelo tipo resultado ser um decimal e a variável um ponto flutuante.

4.       Adicionar uma variável do tipo Decimal chamada vDecimal ao pacote.
5.       Adicionar uma expression task com a seguinte expressão: @[User:: vDecimal] = 43 / 3
a.       Analisando o valor da variável após a expressão: 14
b.      Para termos um valor inteiro como resultado da divisão é porque estamos tratando dois inteiros como divisor e dividendo, então pela precedência dos tipos o resultado também é um valor inteiro.

6.       Alterar a expression task com a seguinte expressão: @[User:: vDecimal] = ((DT_DECIMAL, 4) 43) / 3
a.       Notem que estou fazendo a conversão do número 43 para DECIMAL com escala 4. No SSIS o tipo decimal possui precisão 29, diferente do tipo DT_NUMERIC (usando no pipeline) onde você pode definir até 38 como precisão.
b.      Analisando o valor da variável após a expressão: 14
c.       É aqui que o está o pequeno detalhe, o valor default para a variável decimal é 0, então o SSIS infere o tipo DECIMAL(29, 0). Então por padrão você NÃO vai ver casas decimais para a sua variável!

7.       Alterar o valor default da variável vDecimal para 0.01
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14.33
b.      Como você definiu o valor default para a variável como 0.01, então o SSIS infere o tipo DECIMAL(29, 2).

8.       Alterar o valor default da variável vDecimal para 0.0001
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14.3333
b.      Como você definiu o valor default para a variável como 0.0001, então o SSIS infere o tipo DECIMAL(29, 4).

9.       Alterar o valor default da variável vDecimal para 0.0000
a.       Analisando o valor da variável após a expressão que faz o cast, temos: 14
b.      Como você definiu o valor default para a variável como 0.0000, então o SSIS considerou o valor zero e infere o tipo DECIMAL(29, 0).
Isto é, se você quiser um decimal de 4 casas após a virgula e que no início do pacote o valor seja zero, você precisa definir o valor inicial como 0.0001 e no início do pacote alterar o valor para zero. Bem chato esse detalhe.
Eu revisei os novos livros do SSIS 2012 e nenhum parece tratar esse assunto, então resolvi colocar aqui para que seja validado com todos vocês (qualquer ponto que passou despercebido me avise!). Espero que você tenha cuidado e não introduza efeitos colaterais indesejados no seu pacote ao utilizar variáveis do tipo Decimal.
Em tempo, eu abri uma entrada no Connect sobre essa questão (https://connect.microsoft.com/SQLServer/feedback/details/780244/add-scale-property-to-a-decimal-variable-in-ssis, vamos ver se a Microsoft se pronuncia a respeito disso e quem sabe, de forma favorável.
Abraços

sábado, 1 de setembro de 2012

Review do livro – SSIS 2012 An Expert Cookbook

Vamos a mais um review, dessa vez do livro Microsoft SQL Server 2012 Integration Services: An Expert Cookbook dos autores Reza Rad e Pedro Perfeito. Você pode pode comprar o livro na Amazon (http://www.amazon.com/Microsoft-Server-2012-Integration-Services/dp/184968524X). Eu aproveitei a versão para o Kindle para dar uma olhada neste livro.
Antes de começar a ler o livro é importante ressaltar que como o próprio nome diz é um livro de receitas, então durante o livro você vai encontrar detalhadamente (literalmente um passo a passo) de como executar diversas tarefas no SSIS, por exemplo: “Executing SQL Task”, “Importing XML data with XML Source”, “Working with BLOB fields: Export Column and Import Column transformations”, “Foreach Loop Container: looping through files using File Enumerator” e “Transactions: Doing multiple operations atomic”.
O que eu mais gostei:
·         O livro é direto, mostra como executar uma determinada tarefa com o SSIS sem enrolação.
·         Se é um livro de receita que me dê todos os passos, e isso ele faz muito bem. Então basta seguir literalmente o que foi dito que sua tarefa estará feita.
·         O livro detalha exemplos de quase todas as transformações e tarefas que encontramos na toolbox, então são mais de 80 receitas espalhadas pelo livro.
·         Para os controles mais usados mostra tarefas comuns que todo mundo precisa fazer, ao invés de tentar inventar um exemplo mais complexo, o que é uma ótima abordagem para nosso dia-a-dia.
·         Seções “How it Works”: depois do passo a passo (how to do it) o livro trás uma seção com uma explicação e detalhamento do que você está fazendo, conceituando um pouco o funcionamento do elemento.
o   Por exemplo, na tarefa SQL uma dúvida comum é como fazer a passagem de parâmetros para ODBC, OLEDB, ADO e ADO.NET. O livro já te traz uma tabela e exemplos de uso.
·         Links para maiores detalhes e referências na documentação, já que o livro não foca na explicação detalhada, é importante termos ganchos por onde continuar.
O que podia melhorar:
·         Para todo exemplo cenários o livro faz uma pequena introdução do uso, mas algumas vezes acho que falta uma motivação para o uso, quando você usaria ou alternativas para a receita.
·         Sendo um livro de receita não acredito que é necessário abordar alguns itens mais complexos, como custom taks, desempenho dos pacotes, entre outros. Por fim acaba sendo um overview mais no estilo dá para fazer do que efetivamente é assim que se faz.
·         As receitas mostram tarefas específicas, mas o leitor ainda precisa pegar algumas receitas do livro para montar um pacote completo, e por isso quero dizer aquele projeto mais complexo que você vai colocar em produção. Então se você procura por padrões de pacotes no SSIS ou como compor sua solução, esse não é o livro.
·         Como é um livro de receita, o livro acaba colocando coisas simples e complexas juntas, então você tem algumas partes falando desde criação de variáveis e disposição da interface do SSIS até outras coisas que falam sobre CDC, DQS, criação de tarefas, etc.
Você só vai encontrar novidades do SSIS 2012 nesse livro? Claro que não, a grande maioria do livro aplica-se também ao SSIS 2008 e 2005, mas o autor não deixa de mostrar as novidades da versão 2012.
Minha avaliação do livro: quatro estrelas. Acho que o livro atinge bem o objetivo a que se propõe: ser um livro de receitas. Mas falha em não ser mais detalhado em alguns pontos, eventualmente mostrar receitas para tarefas de raro uso e por fim, não é um livro Expert como o título diz, pelo contrário, eu chamaria de “An basic Cookbook”.
Então este é um livro que pode ser útil para todo DBA e desenvolvedor que quer usar o Integration Services e deve ser especialmente útil na prateleira de uma empresa onde pode servir de referência para consulta rápida. Mas se você quer um livro que ensina de forma linear desde as coisas mais básicas do SSIS até chegar nos módulos avançados, procure outro estilo de livro.
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

terça-feira, 24 de abril de 2012

Instalação do BDD falha na checagem dos requisitos


Faz alguns meses eu fui instalar o BDD na máquina nova e me deparei com um problema: a checagem dos pré-requisitos não deixava a instalação continuar, alegando que estava faltando um dos pré-requisitos. Para a apresentação (e na pressa) eu usei uma máquina antiga que tinha o BDD e deixei esse problema de lado.

Nessa semana vou usar o BDD para testar desempenho de alguns pacotes em um cliente e novamente estava lá o erro de instalação do BDD de 32 bits, o que é necessário para você montar o seu pacote, já que o Visual Studio 2008 é um processo de 32 bits.

A mensagem do erro é “Product: Microsoft SQL Server SSIS Balanced Data Distributor (x86) -- The installation is not successful. Check the following prerequisites: 1. Either Integration Services or BIDS has to be installed. 2. The version of these components has to be either SQL Server 2008 SP2 (or future SPs) or SQL Server 2008 R2 (or future SPs).”

Validei novamente, todos os pré-requisitos instalados e o diabo da mensagem aparecendo. Como não têm nenhum log de instalação e neste momento não consigo nem saber em qual validação de componente ele está parando, além da documentação não me dar uma lista extensiva das checagens, só me restou a ir para o meu mecanismo de busca favorito...

Olha aqui que belezura, viva os fóruns e blogs! 
Thread no MSDN: http://social.msdn.microsoft.com/Forums/en/sqlintegrationservices/thread/bbbc2366-5e76-4a06-af48-23c188a2506b
Link que está na thread: http://joshgallagher.info/2012/01/25/installing-balanced-data-distributor-on-sql-server-2008-r2-sp1/

Mesmo com o diabo da mensagem falando “SQL Server 2008 R2 (or future SPs)” é necessário “retroceder” a versão do SQL Server 2008 R2 para o RTM editando chaves de registro, caso você tenha instalado o SP1 (e possivelmente algum hotfix ou cummulative update). Outra opção seria desinstalar o SP1, instalar o BDD e instalar o SP1... Fiquei com a primeira abordagem. Mas que beleza!

Como eu já falei do BDD antes, resolvi postar sobre o assunto e fica mais uma referência para a solução deste vacilo do setup. Tomara que possa te ajudar ou pelo menos que o seu mecanismo de busca melhore o ranking da resposta postada no fórum! :-)


PS: E CLARO, não se esqueça de voltar as chaves de registro ao valor original. Ugh!


[]s

Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

sexta-feira, 17 de fevereiro de 2012

Arquivos do webcast SSIS para o MCITPSC

Na semana passada eu gravei um webcast para o grupo MCITPSC sobre o assunto: confiabilidade de pacotes no SSIS.

Coloquei no skydrive um zip (https://skydrive.live.com/redir.aspx?cid=e145f7753042d628&resid=E145F7753042D628!1299&parid=E145F7753042D628!196) com o seguinte conteúdo:

  • Projeto SSIS com as demos
    • Incluí um exemplo simpes de snapshot que não deu tempo de falar no dia.
  • Script T-SQL auxiliar (também utilizado no dia)
  • PDF com o conteúdo dos PPTs
Também publiquei no slideshare (http://www.slideshare.net/LucianoMoreira1/confiabilidade-de-pacotes-no-ssis) os PPTs para quem preferir ver por lá.

A gravação da sessão pode ser vista no mesmo link disponibilizado para realização do evento, este aqui: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032504533&Culture=pt-BR


Obrigado a todos que participaram do evento ao vivo!


Novo lema… “Se você acha que sabe alguma coisa, pense de novo.” 

Novo lema 2… “Se você acha que já sabe tudo sobre um assunto, você é um idiota.”

[]s


Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.srnimbus.com.br
@luticm


terça-feira, 7 de fevereiro de 2012

Webcast - Confiabilidade dos pacotes no SSIS

Bom dia pessoal.
Hoje participarei da semana de webcasts SQL Server com a comunidade MCITP SC, evento organilzado pelo Marcos Freecia (@SqlFreccia), onde vou falar um pouquinho sobre confiabilidade de pacotes no SSIS...

Palestrante: Luciano Moreira (Luti) (@luticm)
Palestra:  Confiabilidade dos pacotes no SSIS
Descrição:
 Apenas criar um pacote com um alguns controles e data flows é suficiente para uma solução robusta? Provavelmente não! Nesta sessão serão apresentados recursos que podem ser empregados para aumentar a confiabilidade do pacote, como utilização de transações, checkpoints, database snapshots, tratamento de erros no data flow e eventos. No fim da apresentação você será capaz de entender cada um deles e analisando os pontos fortes e fracos de cada um, saber qual melhor se encaixa na sua solução.
Horário:
20:00 a 21:00


O link para inscrição está aqui: 
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032504533&Culture=pt-BR

Se interessa por SSIS? É hoje 20:00h!

[]s


Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

segunda-feira, 14 de novembro de 2011

Treinamento de SSIS da Sr. Nimbus

Bom dia pessoal.
Anunciamos um novo treinamento a ser ministrado em Brasília, dessa vez sobre o famoso SQL Server Integration Services.

Particularmente eu demorei demais a colocar esse treinamento no calendário, pois já estou trabalhando constantemente com ele desde 2009 e se tornou um dos meus grandes interesses na plataforma da Microsoft, então nada mais justo que mostrar para o público como o SSIS é fantástico através de um treinamento profundo e detalhado.

Originalmente eu pensei em somente ministrar um treinamento avançado de SSIS, mas discutindo a ementa internamente e com pontenciais clientes, todos foram a favor de se manter os dois módulos (básico e avançado), já que algumas coisas que eu vou apresentar no básico... não são básicas! Só para variar, claro, faremos um treinamento com detalhes que podem ser bem avançados, então até o profissional que já faz alguns pacotes no dia-a-dia irá se beneficiar de participar de ambos os treinamentos.

A ementa dos treinamentos estão aqui: SQL05 e SQL06.

Datas: dezembro/2011 e Janeiro/2012.
Local: Brasília

Para participar dos treinamentos, veja a chamada no site da Nimbus.

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

sexta-feira, 27 de maio de 2011

Balanced Data Distributor para o SSIS

Estava navegando pelos meus RSSs e encontrei algo fantástico para o SSIS. Um blog de performance do SQL Server, parado a mais de um ano, publicou um post sobre o Balanced Data Distributor que você pode ler aqui: http://blogs.msdn.com/b/sqlperf/archive/2011/05/25/the-balanced-data-distributor-for-ssis.aspx.

Olha que bacana, agora podemos colocar no data flow um componente que quebra o fluxo de dados em diferentes fluxos de saída (potencialmente com uma distribuição homogênea), permitindo utilizar um maior paralelismo no seu pacote e melhorar o desempenho na carga dos dados.

O post do Len Wyatt já dá uma explicação legal, discutindo possíveis casos de gargalos, então não vou ficar muito na teoria. Para alimentar o espírito geek eu baixei o BDD e fiz um pequeno teste no SSIS.

Cenário: criei um raw file com 30.000 registros e disparei da minha máquina (um dual core) o pacote. Este vai pegar esses registros e fazer 30.000 lookups contra um servidor SQL Server (nada parrudo, uma máquina bbeeemmm simples), inserindo os campos originais mais um campo retornado pelo lookup em uma tabela de destino (deixei como uma heap).
Minha intenção é conseguir paralelizar os lookups e ver o ganho de desempenho, já que o lookup é uma operação cara (ainda mais com a forma padrão que o SSIS trabalha).

Abaixo temos as três figuras, mostrando o BDD trabalhando com um, dois e quatro fluxos de dados.

BDD_1fluxo
Figura 01 – Somente um fluxo de dados

BDD_2fluxos
Figura 02 – Dois fluxos de dados

BDD_4fluxos
Figura 03 – Quatro fluxos de dados

Executei cada teste duas vezes e registrei os tempos de execução de cada pacote…

1 fluxo de dados
Tempo 1: Finished, 1:12:38 PM, Elapsed time: 00:01:00.123
Tempo 2: Finished, 1:15:12 PM, Elapsed time: 00:00:53.493


2 fluxo sde dados
Tempo 1: Finished, 1:17:07 PM, Elapsed time: 00:00:38.376
Tempo 2: Finished, 1:18:32 PM, Elapsed time: 00:00:33.650


4 fluxos de dados
Tempo 1: Finished, 1:21:04 PM, Elapsed time: 00:00:24.804
Tempo 2: Finished, 1:22:00 PM, Elapsed time: 00:00:23.962


Com o paralelismo do BDD e quatro fluxos o tempo caiu de quase um minuto para 24 segundos! E isso que as máquinas não são boas ou massivamente paralelas, imagine isso rodando em um servidor feroz.

Outro detalhe interessante do BDD que já dá para perceber pelos testes é a forma que ele trabalha. Ele não vai jogar uma linha para um fluxo, depois outra linha para outro fluxo e assim sucessivamente, o BDD pega o conteúdo do buffer e vai jogando para cada fluxo. Na figura 3 podemos notar que depois de já ter distribuido 28.671 registros, somente sobraram 1.329 para o quarto ramo. Uma implementação bem eficiente que nos dá indício que ainda podemos tirar vantagem de alguns ajustes do tamanho do buffer no pipeline.

Antes desse componente poderíamos tentar algo bem menos efetivo, fazendo um gatinho (mmiiaauuu) com o conditional split. Mas aí você deveria definir como são distribuídos os fluxos e a lógica teria que ser muito eficiente para não haver um desbalanceamento nos ramos… Algo como um campo que tivesse uma distribuição homogênea para os registros e estes intercalados, para garantir a distribuição igualitária durante o processamento dos buffers, senão você teria um ramo sendo usado primeiro, depois outro, etc. (sem um paralelismo efetivo). Isto é, antes do BDD a ideia é factível, mas improvável de ser implementado de forma eficiente.

E não, esse não é um componente que está no Denali, pelo menos eu ainda não vi nada a respeito sobre a inclusão dele e os CTPs não possuem esse componente… Mas bem que poderia ser incluído!

Eu me diverti, e você?

Atualização
{

A dúvida do Rodrigo é muito pertinente! A diferença do BDD para o multicast NÃO está no paralelismo, pois o multicast também pode usufruir de múltiplas thread, mas normalmente com os ramos fazendo operações diferentes entre si ou populando destinos diferentes.

Supondo que no multicast você têm 12 regsitros no pipeline, os mesmo 12 registros vão fluir em cada ramo. Então supondo 4 ramos, se você inserisse tudo na mesma tabela iria acabar com 48 registros, cada um aparecendo 4 vezes.

Com o BDD os 12 registros que entram no pipeline serão distribuídos entre os ramos, deixando 3 registros para cada ramo (exemplo hipotético, já que no fundo a divisão é feita pela quantidade de registros que cabe em um buffer do pipeline). Se inseridos em uma única tabela, como foi o meu exemplo, você teria os 12 registros sem duplicatas.

Espero ter sido claro, qualquer coisa grita!

}

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

terça-feira, 11 de janeiro de 2011

SSIS Fuzzy Lookup e SQLDumper

Ontem eu passei por um bug do SSIS que já está registrado no Connect, mas ainda não tem nenhuma informação de solução. Aproveitei para me distrair um pouco com o dump e resolvi blogar o bug, pois talvez você possa passar pelo mesmo. Então vamos lá...

Estou com minha máquina x64 e usando o BIDS montei um pacote simples que utilize fuzzy lookup (no meu caso contra uma tabela com 1 milhão de registros). Porém quando disparei a execução do pacote, no meio dela apareceu um prompt invocando o SQLDumper e a execução do pacote simplesmente parou, mostrando o mesmo em execução (amarelo), sem falhar ou terminar com sucesso. Mudei um parâmetro ou outro, a massa de dados e nada de resolver o problema, a execução do pacote sempre parava da mesma forma.

Uma pesquisa rápida na internet me mostrou a resposta, que estava lá no connect: Fuzzy lookup triggers SQLDUMPER, even with very small dataset with Run64BitRuntime set to false. Então basta ir à configuração do projeto, em Debugging, e colocar a opção Run64BitRuntime como true. Tentei novamente e tudo funcionou, mas particularmente ainda espero uma resposta definitiva, pois poderia ser um caso onde eu não tenho um driver 32 bits (veja comentário no connect) ou então eu quero após o lookup debugar um script component e, como vocês sabem, tenho que definir a opção acima como false para meu breakpoint funcionar corretamente.

Por curiosidade, peguei o mini dump no caminho “C:\Program Files (x86)\Microsoft SQL Server\100\Shared\ErrorDumps\SQLDmpr0003.mdmp” e abri no Visual Studio 2010, onde no dump summary podemos ver descrito claramente um access violation (0xC0000005) com a informação: “The thread tried to read from or write to a virtual address for which it does not have the appropriate access.”
 
Continuando a diversão, peguei o minidump e abri no windbg, então logo de cara ele mostra a thread de nosso interesse (número 204):

This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(36d0.204): Access violation - code c0000005 (first/second chance not available)

Carreguei os símbolos corretos e deu uma olhada na thread stack:

# 24 Id: 36d0.204 Suspend: 0 Teb: fff0e000 Unfrozen
ChildEBP RetAddr Args to Child
1186ea28 76c10816 00000770 00000000 1186ea70 ntdll!ZwWaitForSingleObject+0x15
1186ea94 75511184 00000770 00000064 00000000 KERNELBASE!WaitForSingleObjectEx+0x98
1186eaac 75511138 00000770 00000064 00000000 kernel32!WaitForSingleObjectExImplementation+0x75
1186eac0 00a9a0be 00000770 00000064 73773105 kernel32!WaitForSingleObject+0x12
1186eb48 00a99c99 737731c9 00000000 00000104 DtsDebugHost!CDmpDump::DumpInternal+0x32e
1186eb84 00a9325a 00a9d5fc 73773799 644b3000 DtsDebugHost!CDmpDump::Dump+0x59
1186edd4 00a932db 1186eea8 00000000 1186edf0 DtsDebugHost!SSISInternalPerformDump+0x19a
1186ede4 6419cccf 1186eea8 1186ee78 75539d57 DtsDebugHost!WEDExceptionFilter+0xf
1186edf0 75539d57 1186eea8 708ea443 00000000 mscorwks!InternalUnhandledExceptionFilter+0x16
1186ee78 774306e7 1186eea8 774305c4 00000000 kernel32!UnhandledExceptionFilter+0x127
1186ee80 774305c4 00000000 1186fb70 773ec390 ntdll!__RtlUserThreadStart+0x62
1186ee94 77430469 00000000 00000000 00000000 ntdll!_EH4_CallFilterFunc+0x12
1186eebc 77418799 fffffffe 1186fb60 1186eff8 ntdll!_except_handler4+0x8e
1186eee0 7741876b 1186efa8 1186fb60 1186eff8 ntdll!ExecuteHandler2+0x26
1186ef90 773d010f 0086efa8 1186eff8 1186efa8 ntdll!ExecuteHandler+0x24
1186ef90 769c99e4 0086efa8 1186eff8 1186efa8 ntdll!KiUserExceptionDispatcher+0xf
1186f2e8 75c4747e 80010088 660330a8 40600000 msvcrt!memcpy+0x1e0
1186f308 75404c78 1186f324 8001007c 1186f7f4 oleaut32!BSTR_UserMarshal+0x50
1186f344 75404c0d 1186f7f4 00359f8a 80010078 rpcrt4!NdrpUserMarshalMarshall+0x4b
1186f374 753e6f8a 1186f3e4 1186f7f4 00359f8a rpcrt4!NdrUserMarshalMarshall+0xd8
1186f3a0 7548013d 708da17a 1186f7ec 0300002c rpcrt4!NdrpClientMarshal+0xf6

1186f7b4 75c0ba02 00359b50 00359f28 1186f7ec rpcrt4!NdrClientCall2+0x19a
1186f7d4 75afc95d 00000020 00000014 1186f894 ole32!ObjectStublessClient+0xa2
1186f7e4 21c571a0 0f81a67c 02379a6c 660330a8 ole32!ObjectStubless+0xf
1186f894 21c571a0 000db174 02379a6c 660330a8 DTS!CGenericEventsImpl::OnCustomEvent+0x2d1
1186f944 21c57a84 000dcbc4 02379a6c 660330a8 DTS!CGenericEventsImpl::OnCustomEvent+0x2d1
1186f96c 227ec729 02379a6c 660330a8 003b8404 DTS!CComponentEventsImpl::FireCustomEvent+0x47
1186f998 227d6d5f 00000000 660330a8 003b8404 DTSPipeline!CErrorHandler::FireCustom+0x52
1186f9b8 6605a756 023eb850 660330a8 003b8404 DTSPipeline!CComponentMetaDataObject::FireCustomEvent+0x26
1186fa2c 2280f75f 023ea488 00000014 1fb555e0 TxBestMatch!CTxFuzzyLookup::ProcessInput+0x107
1186fa94 2280f387 2401e670 00000000 023f3c8c DTSPipeline!CPathExecutionItem::DoWorkPI+0x21a
1186fab4 228119b7 1186fad3 023ef018 00000000 DTSPipeline!CPathExecutionItem::DoWork+0x3d
1186fad4 22811a71 00000000 00000000 1186fb1c DTSPipeline!CSchedulerThread::ProcessWork+0x55
1186fae4 728d29bb 023f3c8c 708dad70 00000000 DTSPipeline!CSchedulerThread::ProcessWorkThreadProc+0x1f
1186fb1c 728d2a47 00000000 75513677 023ef018 msvcr80!_endthreadex+0x3b
1186fb24 75513677 023ef018 1186fb70 773f9d42 msvcr80!_endthreadex+0xc7
1186fb30 773f9d42 023ef018 597c16c4 00000000 kernel32!BaseThreadInitThunk+0xe

1186fb70 773f9d15 728d29e1 023ef018 00000000 ntdll!__RtlUserThreadStart+0x70
1186fb88 00000000 728d29e1 023ef018 00000000 ntdll!_RtlUserThreadStart+0x1b

Olhando a pilha acima, vemos que o pipeline do SSIS estava em execução e processando o nosso fuzzy lookup, quando ele foi fazer uma cópia de memória (memcpy), que gerou a exceção, pois logo depois temos o dispatcher da exceção que em breve utiliza o CDmpDump para gerar o mini dump.

Se executarmos a instrução .ecxr poderemos ver efetivamente que foi a instrução memcpy que gerou a exceção, inclusive quais foram as posições de memória, armazenadas nos registradores ESI e EDI, com o correto ajuste de segmento.

0:024> .ecxr
eax=a66330a8 ebx=1186f7f4 ecx=067f73d6 edx=00000000 esi=8000fffc edi=99fecfdc
eip=769c99e4 esp=1186f2e0 ebp=1186f2e8 iopl=0 nv dn ei pl nz ac po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010612
msvcrt!memcpy+0x1e0:
769c99e4 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

Erro simples e solução mais ainda, mas valeu a diversão. Espero que você tenha gostado e até um próximo post!

 
[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

sábado, 30 de outubro de 2010

Sessão: Otimizando carga de dados com o SSIS e SQL Server

Bom dia pessoal.
Devido ao nascimento do meu filho eu não consegui me acertar ao novo ritmo e participar do WOTD (http://www.online.techday.net.br/), um belo evento que aconteceu hoje.

Minha sessão seria: "Otimizando carga de dados com o SSIS e SQL Server". Então para não deixar na mão os que haviam se cadastrado e cumprir o acordado, eu vou marcar um novo horário em novembro e apresentar o meu tema. Será através de uma sessão de live meeting que abrirei (e provavelmente vou passar da hora regulamentar! hahaha).

Fique ligado neste blog e no twitter, pois farei o anúncio em breve.
Me desculpem qualquer transtorno.

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
http://www.srnimbus.com.br/

quarta-feira, 13 de outubro de 2010

24 horas de SQL Server = 24H PASS LATAM

Bom dia pessoal.
Na próxima semana eu estou vou fazer mais uma apresentação virtual para todos aqueles que gostam de SQL Server e SSIS. E o melhor, não sou só eu quem vai falar, na verdade outros 23 feras de SQL Server também estarão falando sobre SQL Server 2008 (e R2).

O evento é uma organização do PASS (Professional Association for SQL Server - http://www.sqlpass.org/) na América Latina. Os detalhes do evento e toda as sessões você pode conferir aqui: http://www.sqlpass-latam.org/24horas.aspx.

Minha apresentação

Título: Padrões de pacotes no SSIS
Descrição: Não falamos muito de padrões de projetos e padrões de arquitetura? Por que não falar sobre padrões de pacotes no SSIS? Nessa sessão eu quero falar um pouco sobre a possibilidade de se reutilizar estruturas comuns para pacotes no SSIS e propor alguns padrões que eu tenho encontrado enquanto estou trabalhando com o Integration Services. Claro que não sou um Fowler ou Gamma, muito longe disso, mas se conseguir com a sessão incentivar alguma coisa em torno do assunto, será muito interessante.

Gostou da proposta? Então pare uma horinha e participe da sessão!

NOTA: As sessões estão marcadas para um horário e nosso fuso está três horas a frente deles, então quando a sessão que se inicia 7:00h para Brasília será 10:00h. Com isso minha sessão será 15:00h amanhã.

[]s
Luciano Caixeta Moreira - {Luti}
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm
www.srnimbus.com.br

quinta-feira, 24 de junho de 2010

A busca sem fim: Qualidade dos dados

Prólogo: No último ano eu tenho trabalhado bastante com projetos de integração de bases e limpeza de dados, acumulando uma boa experiência com SQL Server e SSIS, além do processo de limpeza, integração, problemas mais comuns, falta de conhecimento do mercado sobre o assunto e miopia da gerência sobre o assunto, que se ainda não assombra, com certeza ainda trará sustos para a organização. As empresas estão cada vez mais cientes sobre processo de desenvolvimento, ALM, ferramentas, soluções de TI, etc. Mas a limpeza de dados e integração são assuntos extremamente delicados e muitos preferem não levantar o tapete para descobrir a poeira que está embaixo.

Dito isso comecei a escrever um artigo sobre qualidade de dados e, pelo andamento da carruagem e listagem dos tópicos, acredito que ele vai crescer muito. Então ao invés de esperar N dias para algo completo, resolvi publicar paulatinamente o texto em meu blog para apreciação. No fim vocês terão um artigo completo em PDF, mas até lá gostaria de ouvir a opinião de vocês sobre o assunto.

Espero que gostem...


A busca sem fim: Qualidade dos dados

 Durante meus últimos anos trabalhando com o SQL Server, uma constante de muitos lugares onde eu passei foi a qualidade, vamos dizer, duvidosa dos dados e a bagunça que vai se formando quando a empresa e o número de sistemas crescem. Começam a surgir “mini-sistemas” (e soluções departamentais) para atender a demandas pontuais de negócio, grandes sistemas com “puxadinhos” para atender novas regras de negócio ou tentar facilitar a vida do usuário final.

Dentro desse contexto de crescimento e evolução da tecnologia da informação, é natural que chegue um momento onde a alta gerência da empresa passe a demandar uma visão consolidada de toda empresa, seja implantando uma solução de BI, ERP, CRM, e outras tantas sopas de letrinhas.

É nesse momento, quando nas N bases isoladas nas mais diversas e esdrúxulas fontes de dados, precisam ser integradas, limpas e conformadas, para que a nova solução empresarial (usualmente iluminada pelos holofotes de toda organização, nascendo cheio de expectativa e promessas de maravilhas) consiga atender seu objetivo.

E esse processo de extração, transformação e carga dos dados (ELT – Extract, Transform, Load) ou ECCD (Extract, Clean, Conform, Deliver) – termo “roubado” dos jargões de DW, que precisa ser executado para garantir o nascimento de uma linda criança, e não um Frankstein cheio de remendos. Esse pequeno item, que de pequeno não têm nada, é onde as dificuldades aparecem e muitas vezes não é dada a devida atenção, tocando em um ponto crucial, a qualidade dos dados.

Notem que não estou restringindo o ETL a ser usado somente por um projeto de DW, se estou fazendo uma integração de bases terei que passar naturalmente por esses mesmos passos, só que não carregarei uma estrutura dimensional, mas talvez crie um único banco de dados centralizado ou um repositório para master data management.


Um repositório com 100% de qualidade de dados ... É possível?


SIM... Com um pequeno detalhe: desde que sejam acordadas pelo cliente e área de TI as exatas definições de qualidade (e este não seja 100% de limpeza e conformidade em todas as entidades). Realisticamente falando, essas definições nunca serão conseguidas durante a análise de requisitos, mas sim durante a limpeza dos dados e com a correta dimensão do tamanho do problema (profiling). Durante esse processo, o faxineiro (área de TI) e o patrão (negócio) podem concordar que manter uma poeira na estante é aceitável, mas é claro que a expectativa é sempre que a casa fique brilhando, mas para isso acontecer só embalando tudo a vácuo...

Agora, 100% de limpeza como normalmente está na cabeça do usuário final (nenhuma inconsistência em ponto algum), eu não acredito. Não por falta de ferramentas ou abordagens para fazer isso, mas porque os sistemas originais, os vícios do usuário final e todas as estruturas que geram as inconsistências não serão trocados no mesmo instante em que você acabou de fazer a melhor limpeza, digna dos deuses. Então eu consigo pensar em um conjunto de dados (estático) que seja completamente limpo e a qualidade garantida, mas quando esse trabalho acabar, um conjunto de novas inconsistências estarão esperando para serem tratadas.

É importante que o os stakeholders dos novos projetos estejam cientes da dificuldade e complexidade desse processo contínuo de limpeza. E aí eu acho que nós, como TI, falhamos em apresentar por completo as possíveis barreiras que devemos encontrar e tradicionalmente fazemos estimativas mais otimistas que o devido. O problema é que esse dimensionamento e exemplificação não é algo simples, e a experiência e calos passados contam muito na hora de fazer o próximo trabalho.

Meu conselho: se você está trabalhando ou vai participar de um projeto de integração e limpeza de bases, se prepare para um projeto desafiador... (Mas excelente para a alma geek e o bom profissional).


(Continua na parte 02...)



[]s
Luciano Caixeta Moreira - {Luti}
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quarta-feira, 7 de abril de 2010

Fuzzy lookup e tipo de dados da coluna Confidence

Post rápido com uma pequena solução.

Estou usando o fuzzy lookup em um projeto do SSIS, para tentar tirar algumas inconsistências das tabelas, tentando encontrar registros semelhantes como "Luciano Caixeta Moreira" e "Luciano CaiZeta Moreira", por exemplo.

Tudo indo certo, montei a fonte, transformação fuzzy lookup configurada e criei uma nova tabela PessoaFuzzy para armazenar o resultado do que for encontrado. Fui executar o pacote e ... Pau!

"[OLE DB Destination [104]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80004005 Description: "OLE DB provider 'STREAM' for linked server '(null)' returned invalid data for column '[!BulkInsert]._Confidence'."


O erro já direciona o foco para onde está o problema, campo Confidence, mas qual dado é inválido? Coloquei alguns data viewers no pipeline do SSIS para tentar no zoiômetro pegar alguma coisa fora do padrão (estava testando em uma pequena massa de registros) e nada aparente.

Vamos nos voltar para o "pai-dos-desenvolvedores-com-pressa-que-não-querem-gastar-muito-tempo-com-besteira".Uma rápida pesquisa e voilá, solução encontrada.

Quando o SSIS gera a tabela de destino o campo Confidence, o tipo de dados fica como REAL, mas é necessário um FLOAT para armazenar o resultado gerado pelo SSIS! Alterado o campo, tudo funcionou corretamente.

Agora, sinceramente, isso me cheira a um BUG feio. Não era para o BIDS já gerar um campo float de cara? Na verdade eu até estou querendo evitar essa palavra, pois nas duas últimas semanas eu estou passando por uma série de casos que me cheiram a bug e estou ficando um pouco alucinado com isso.

Fica aí uma referência em português sobre o assunto.

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm