[firebase-br] Chave primaria Guid

Carlos H. Cantu listas em warmboot.com.br
Sábado Março 13 22:00:58 -03 2021


Vou dar minha opinião aqui, sem testar nada na prática.

O charset octets apenas garante que cada caractere vai ocupar 8 bits
(ou seja, 1 byte), nem menos, nem mais. Como o GUID tem 16 caracteres,
ele acabará ocupado 128 bits, mas isso tb aconteceria com outros
charsets que não sejam multibyte.

A questão da performance ruim quando o campo é indexado se deve ao
fato de um GUID ser "randômico" demais, evitando portanto que o
Firebird comprima a chave de forma eficaz, tornando a arvore menos
densa e, portanto, consumindo mais tempo para sua manutenção quando é
feito um insert/update. Mas até onde entendo, isso vai acontecer
também com o charset octets.

Retirado da documentação do FB:

"Character set OCTETS: Data in OCTETS encoding are treated as bytes
that may not actually be interpreted as characters. OCTETS provides a
way to store binary data, which could be the results of some Firebird
functions. The database engine has no concept of what it is meant to
do with a string of bits in OCTETS, other than just store it and
retrieve it. Again, the client side is responsible for validating the
data, presenting them in formats that are meaningful to the
application and its users and handling any exceptions arising from
decoding and encoding them."

Em suma, octets armazena uma cadeia de bytes, sendo que cada byte pode
ou não representar um caractere. O FB não quer saber o que cada byte
representa quando se usa octets, ele apenas armazena o que o usuário
envio. A aplicação cliente é que deve interpretar o conteúdo da string
de forma apropriada.

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

CWvl> Vou ler o artigo sim, mas a questão de ter um char ou varchar acima de
CWvl> 16 posiçoes pelo que vi em outros estudos é a lentidão dos índices. 
CWvl> Conforme a tabela cresce o desempenho fica horrível segundo os artigos
CWvl> que li. a vantagem do char(16) octects é que tem o mesmo desempenho de
CWvl> um indice inteiro de 128 bits, portanto melhor pra PK e FK.

CWvl> Mas está tudo no campo da teoria ainda, pois nem consegui fazer funcionar.

CWvl> Obrigado.

CWvl> []'s
CWvl> Carlos Wilson
CWvl> Formosystem
CWvl> Informática e Automação Comercial

CWvl> Em 13/03/2021 17:06, Mário Reis via lista escreveu:
>> Bem recomendo a leitura do link:
>> https://firebirdsql.org/refdocs/langrefupd25-intfunc-gen_uuid.html
>> Já usei com MSSSQLSERVER e guardava numa varchar(35) salvo erro. Já foi há
>> 4 anos já não lembro bem
>> Com os meus melhores cumprimentos
>> Mário Agostinho Reis
>> 919262146
>>
>> Esta mensagem contém informação de natureza confidencial e é
>> exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
>> receber este email agradecemos que não o copie nem o reenvie e que nos
>> notifique do ocorrido através do email de resposta.
>> [image: cloudHQ] <https://www.free-email-tracker.com> Powered by
>> cloudHQ <https://www.free-email-tracker.com>
>>
>>
>> Marcelo - MK Softwares via lista <lista em firebase.com.br> escreveu no dia
>> sexta, 12/03/2021 à(s) 22:58:
>>
>>> Nessa questão de leitura o C# faz bem tranquilo, usando a dll
>>> FirebirdSql.Data.FirebirdClient. É só declarar uma propriedade em uma
>>> class com o tipo Guid e fazer a leitura/gravação no banco sem problemas
>>> algum.
>>>
>>> Agora se usar em string como o Cantu sugeriu, retorna erro de leitura
>>> gravação. Tentamos dessa forma mas sem sucesso, e só conseguimos
>>> solucionar quando mudamos o field para esse domain que compartilhei
>>> anteriormente.
>>>
>>>
>>> Em 12/03/2021 20:32, Carlos H. Cantu via lista escreveu:
>>>> Acredito que você tenha que usar um string e não TBytes.
>>>>
>>>> []s
>>>> Carlos H. Cantu
>>>> eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
>>>> www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br
>>>>
>>>> CWvl> Criei desse mesmo jeito no banco, a questão é na aplicação pra ler
>>> esse
>>>> CWvl> dado.
>>>>
>>>>
>>>> CWvl> []'s
>>>> CWvl> Carlos Wilson
>>>> CWvl> Formosystem
>>>> CWvl> Informática e Automação Comercial
>>>>
>>>> CWvl> Em 12/03/2021 15:57, Marcelo - MK Softwares via lista escreveu:
>>>>>> Aqui usamos C# e para resolver os problemas com guid, criamos esse
>>>>>> domain, e funciona bem tranquilo.
>>>>>>
>>>>>> CREATE DOMAIN UUID AS CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS;
>>>>>>
>>>>>>
>>>>>> Em 12/03/2021 15:44, Carlos Wilson via lista escreveu:
>>>>>>> Boa tarde a todos,
>>>>>>>
>>>>>>> Atravessei a madrugada pesquisando e não achei solução para o meu
>>>>>>> problema. Utilizo o Unidac.
>>>>>>>
>>>>>>> Devido a tantos problemas com replicação e outros em sincronizar
>>>>>>> bancos de várias filiais estou tentando migrar minhas PK para GUID
>>>>>>>
>>>>>>> depois de estudar em alguns lugares vi que a pk tem que ser criada
>>>>>>> como Char(16) Octates. Dessa maneira a pk é gravada como bytes
>>>>>>> binarios e o desempenho fica melhor ao indexar e usar como FK.
>>>>>>>
>>>>>>> No delphi fiz essa função para preenchimento da chave.
>>>>>>>
>>>>>>> function Tdm.IncUUID: TBytes;
>>>>>>> var
>>>>>>>     qry: TUniQuery;
>>>>>>> begin
>>>>>>>     qry := TUniQuery.Create(Self);
>>>>>>>     qry.Connection := DBConn1;
>>>>>>>     qry.SQL.Clear;
>>>>>>>     qry.SQL.Add('select GEN_UUID() from RDB$DATABASE');
>>>>>>>     qry.Open;
>>>>>>>     Result := qry.Fields[0].AsBytes;
>>>>>>>     qry.Free;
>>>>>>> end;
>>>>>>>
>>>>>>> Ao fazer o append ele chama essa função e parece que está
>>>>>>> preenchendo. porém ao dar um post, acontece a excessao:
>>>>>>>
>>>>>>> Could not convert variant of type (array byte) into type (integer).
>>>>>>>
>>>>>>> Atualizei o Unidac mas o erro persiste, mas não sei mais o que posso
>>>>>>> fazer. Alguém, por favor, pode me dar uma luz?
>>>>>>>
>>>>>>> Grato.
>>>>>>>
>>>>>> ______________________________________________
>>>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>>>> Para consultar mensagens antigas:
>>>>>> http://www.firebase.com.br/pesquisa_lista.html
>>>> CWvl> ______________________________________________
>>>> CWvl> FireBase-BR (www.firebase.com.br) - Hospedado em
>>> www.locador.com.br
>>>> CWvl> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>> CWvl> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>> CWvl> Para consultar mensagens antigas:
>>>> CWvl> http://www.firebase.com.br/pesquisa_lista.html
>>>>
>>>>
>>>> ______________________________________________
>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>> Para consultar mensagens antigas:
>>> http://www.firebase.com.br/pesquisa_lista.html
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas:
>>> http://www.firebase.com.br/pesquisa_lista.html
>>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://www.firebase.com.br/pesquisa_lista.html

CWvl> ______________________________________________
CWvl> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
CWvl> Para saber como gerenciar/excluir seu cadastro na lista, use:
CWvl> http://www.firebase.com.br/fb/artigo.php?id=1107
CWvl> Para consultar mensagens antigas:
CWvl> http://www.firebase.com.br/pesquisa_lista.html




Mais detalhes sobre a lista de discussão lista