none
Carga incremental em DW RRS feed

  • Pergunta

  • Boa tarde

    Existe uma solução de BI em Sybase IQ. Essa solução vai servir como fonte de dados para um novo projeto BI em SQL Server.

    A base do DW antigo "em Sybase", recebe uma carga full todos os dias, ela não guarda histórico, a carga do dia anterior é sobreposta pela carga atual (carga diária).

    As fontes de informação do BI antigo, são vários outros sistemas transacionais desconhecidos por nós.

    Todos os dias, iremos nos conectar à base do BI antigo em outro servidor, para pegar os dados e popular o novo BI em SQL Server. O primeiro passo é popularmos uma base de stage para tratamento dos dados.

    A princípio pensamos em fazer carga full das tabelas menores, que geralmente são tabelas cadastrais de dimensões, e fazer carga incremental das tabelas maiores.

    O problema é que ainda não temos como saber (na carga incremental) o que é antigo e o que é novo, quais informações foram alteradas e quais continuam iguais, pois os registros vem misturados e os registros da carga anterior são apagados. Não existe informações da data em que os registros foram inseridos.

    Ainda existe o problema que nem todas as tabelas tem chaves definidas.

    Pensei em fazer a carga incremental apenas das tabelas maiores, tentando definir uma chave primária para elas e guardando as informações do dia anterior em uma tabela separada para poder comparar. Neste caso teria que duplicar as tabelas maiores no sybase pra já filtrar apenas o que for incremental, então carregar para o SQL Server apenas as informações incrementais.

    Dessa forma terei que comparar todas as colunas das tabelas, para saber se o valor de alguma mudou. Não queria fazer isso porque as tabelas grandes tem muitos registros, mas não consegui pensar em nada melhor, já que não consigo identificar o que mudou ou é novo.

    O pessoal daqui sugeriu um algoritmo que conta a quantidade de caracteres dos registros em cada tabela e soma os valores das colunas numéricas e quando chega a carga nova ele faz a mesma coisa para cada registro. Se o número de caracteres e a soma das colunas numéricas for igual para um determinado registro, então eles vão considerar que nada foi alterado, mas se estiver diferente, quer dizer que houve alteração naquele registro, então o registro fará parte da carga incremental.

    Achei esse esquema muito falho, pois posso atualizar uma descrição e ela continuar com o mesmo número de caracteres, e a mesma coisa para as colunas numéricas. Sem contar que para construir essas tabelas com soma de caracteres para cada registro, acho que vai demorar muito.

    Obrigado

    quinta-feira, 11 de março de 2010 21:04

Todas as Respostas

  • Cara me parece que esse processo vai ficar bem lento, vc já pensou em fazer essa carga com restrição de datas?
    Por exemplo, incluir uma coluna (ou se já existir) do tipo Date Time que grave a data de inclusão/ alteração do registro, tipo, Data Venda, Data Update ou Data para Transferência.

    O que vc acha?
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    sexta-feira, 12 de março de 2010 16:43
  • Então kra, na verdade foi a primeira coisa que pensei, mas os registros da carga não possuem nenhuma informação de data de inclusão ou alteração.

    A idéia dessa base do DW antigo é receber as informações consolidadas do último dia e a partir daí gerar alguns relatórios gerenciais com estas informações para este dia. Desta forma, no dia seguinte será feita outra carga completa que irá sobrepor a do dia anterior e serão gerados novos relatórios para este outro dia.

    A base não armazena histórico com o passar dos dias.
    Por exemplo, imagine que vc guarda informações cadastrais sobre estabelecimentos e o total de vendas dos mesmos no dia de hoje. Quando for amanhã, vc receberá novamente a massa total de dados de todos os estabelecimentos, incluindo os estabelecimentos novos que entraram e as alterações que foram feitas nos que já existiam, e as informações de total de vendas do dia (que certamente serão diferentes para este outro dia) e vc não tem nenhuma coluna de flag ou data pra te dizer o que foi alterado ou o que é novo.

    Ou sejá, preciso fazer uma carga incremental das tabelas maiores, apenas com os registros novos ou que sofreram alguma alteração, mas não tenho como identificar quais são esses registros.

    Não adianta eu tentar colocar uma coluna de data nas tabelas do DW antigo, porque quando ele receber a nova carga, irá apagar tudo e sobrepor novamente com as informações sem o preenchimento desta data, e continuarei sem saber o que é antigo e o que é novo.

    A única solução que vejo por enquanto, é duplicar as tabelas maiores (que terão carga incremental) e comparar essas tabelas duplicadas, que terão a carga do dia anterior, com as tabelas originais, que terão a carga atual.
    O problema dessa solução é que tenho tabelas muito grandes e com muitos registros e terei que comparar todas as colunas das tabelas para saber se alguma coisa mudou ou é nova. Gostaria de alguma solução onde não tivesse que fazer esse tipo de comparação.

    Obrigado pela sugestão kra.
    quarta-feira, 17 de março de 2010 18:09
  • Qual a ferrementa de ETL que vc está usando para fazer essa carga?
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quinta-feira, 18 de março de 2010 12:27