Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

usar autonumberhash para criacao de chave primaria

Pessoal Bom dia.. gostaria da seguinte opiniao.

Estou tentando criar uma carga incremental, porem minha chave primaria é composta por 5 campos, se eu os concatenar e utilizar o autonumberhash consigo manter a unicidade a cada carga ?

25 Replies
Clever_Anjos
Employee
Employee

É a mesma função, mas com uma precisão maior.

Uma outra solução é usar a função Hash128/160/256 (Não autonumberhash, só hash[numero]) que gera uma string longa e com uma possibilidade de colisão muito baixa

Clever_Anjos
Employee
Employee

Paulo

Seu script ficaria mais ou menos assim

LOAD

  Hash256(Campo1,Campo2,Campo3,Campo4,Campo5) as PK,

  Campo1,

  Campo2,

  Campo3,

  Campo4,

  Campo5;

SQL SELECT * from tabela1;

LOAD

  PK,

  Campo1,

  Campo2,

  Campo3,

  Campo4,

  Campo5

FROM QVD(qvd)

where not Exists(PK)

Not applicable
Author

Clever fiz o seguinte.

Eu faço a carga de tudo <= data_de_hoje..... e armazeno no qvd.

Em seguida eu faço novamente o load onde data = data de hoje e depois faço o segundo load da carga inicial aplicando o where not exists para nao duplicar os registros.

Segue o exemplo, a minha carga inicial dos dados onde a dt_versao <= dia_de_hoje, armazena no qvd 758.802 registros.

Mudo o meu 1 metodo LOAD para carregar somente os registros  dt_versao = dia_de_hoje, que seriam 41 registros.

Ao concatenar no 2 metodo LOAD aplicando o WHERE NOT EXISTS da Pk. o correto seria trazer somente 758759 do arquivo QVD....

Porem isso nao ocorre, ele acaba carregando 676308 registros... ficando incompleto ..

Sera que esta ocorrendo colisao ?

Clever_Anjos
Employee
Employee

Poderia colar seu código aqui?

Not applicable
Author

TESTE:

LOAD

    HASH256(agencia,

         nro_conta,

         nro_captacao,

         nro_parcela,

         dt_movimento,

         operacao,

         extrato) AS pk,

        *;

SQL

  SELECT A.agencia,

           A.nro_conta,

        A.nro_captacao,

        A.nro_parcela,

        A.dt_movimento,

        A.operacao,

        A.extrato

  FROM movimento_saldo_captacao_financeira_pessoa_fisica A

  WHERE A.dt_movimento = data_base() 

  ORDER BY dt_versao DESC;

Concatenate

TESTE:

LOAD pk,

     agencia,

     nro_conta,

     nro_captacao,

     nro_parcela,

     dt_movimento,

     operacao,

     extrato

FROM D:\BKP_14102013\qvd\teste\Qlik_conta_grafica.qvd(qvd)

WHERE NOT EXISTS(pk);

STORE TESTE INTO ..\qvd\Qlik_conta_grafica.qvd (qvd);

Clever_Anjos
Employee
Employee

Essa combinação abaixo deveria ser unica? tem chance de repetir?

         agencia,

         nro_conta,

         nro_captacao,

         nro_parcela,

         dt_movimento,

         operacao,

         extrato

Not applicable
Author

Não, ela é unica.

Verifiquei no BD inclusive.

Clever_Anjos
Employee
Employee

Faz um teste por favor

Faz um load com e sem o where exists e veja se traz uma quantidade diferente

TESTE:

LOAD pk,

     agencia,

     nro_conta,

     nro_captacao,

     nro_parcela,

     dt_movimento,

     operacao,

     extrato

FROM D:\BKP_14102013\qvd\teste\Qlik_conta_grafica.qvd(qvd)

WHERE NOT EXISTS(pk);

Not applicable
Author

Então ja fiz este teste hehhehhe

Se eu considerar o WHERE a tabela carrega 676.308 registros.

Removendo o WHERE 758.843

Clever_Anjos
Employee
Employee

Então tem PK duplicado,

faz assim pra verificar os duplicados

Faca uma grafico tabela simples e coloque PK como dimensão

coloque count(distinct PK) como expressão, dai vamos achar quais estão duplicados