[firebase-br] Velocidade em select CHAR X VARCHAR

Eduardo Jedliczka jedyfb em gmail.com
Ter Jun 9 10:05:39 -03 2009


Se é para detalhar, vamos estender o assunto.

Um campo char(12) pode gastar diferentes quantidades de bytes conforme o
charset / collate. há colates (como o unicode) que precisam de 2 bytes
por caracter e também há alguns que usam 3 bytes por caracter, ou seja,
um char(12) pode chegar à 36 bytes.

Um campo varchar(12) também sofre com esta característica, mas ele
dispões de 1 ou 2 bytes a mais para saber o tamanho usado.

Sem contar que em alguns casos é realizada uma conversão de charset nos
campos char e varchar.

Resumindo...

Se está preocupado com performance, o melhor campo para ser PK é o
Numérico.

Abraço

Eduardo

Em Ter, 2009-06-09 às 09:04 -0300, Sandro Souza escreveu:

> Bom dia/tarde Marcelo.
> 
> Grande Marcelo, apoio o que o nosso grande amigo Eduardo Jedliczka postou.
> 
> Só complementando o que ele já postou, ainda sugiro que o banco tenha sido
> criado no dialeto 3, permitindo assim que você possa usufruir de melhores
> recursos do Firebird, como por exemplo, a maior precisão numérica.
> 
> Quando você cria campos do tipo FLOAT ou DOUBLE PRECISION, ou então do tipo
> NUMERIC ou DECIMAL em dialetos inferiores a 3, o Firebird armazena-os como
> números de ponto flutuante, ou seja, são apenas aproximações numéricas.
> 
> Nesse cenário, quando você armazena 1, estará armazenando
> 0.99999999999999999999, o que é aproximadamente 1, mas não EXATAMENTE 1. E
> esse problema de precisão começa a ser visível quando você efetua somatórios
> e médias, podendo dar resultados diferentes do esperado.
> 
> No dialeto 3, o Firebird faz o possível para tentar armazenar os campos de
> tipo NUMERIC e/ou DECIMAL internamente como valores inteiros, justamente
> para permitir o máximo de precisão numérica.
> 
> Nesse mesmo dialeto, a quantidade de dígitos totais do campo determinará o
> tipo de inteiro a ser utilizado (SMALLINT, INTEGER ou BIGINT), já que cada
> um deles tem seus limites de precisão numérica.
> 
> Resumindo, criei a seguinte tabela:
> 
> +-------------+------------------------------+
> |   Dígitos   |         Tipo interno         |
> +-------------+------------------------------+
> | De 1 até  4 | SMALLINT (16 bits = 2 bytes) |
> | De 5 até  8 | INTEGER  (32 bits = 4 bytes) |
> | De 9 até 18 | BIGINT   (64 bits = 8 bytes) |
> +-------------+------------------------------+
> 
> Com relação às casas decimais, são feitas divisões e multiplicações por
> potências de 10 (de acordo com a quantidade de casas decimais) nos momentos
> em que esses valores são utilizados nos cálculos.
> 
> Agora relacionando todo esse "blá blá blá" com a sua questão:
> 
> Se você preferir armazenar esses valores como strings (CHAR(12) ou
> VARCHAR(12)), então cada valor, no mínimo, vai consumir 12 bytes/caracteres
> de espaço interno.
> 
> Se você criou o seu banco de dados no dialeto 3 e preferir armazenar esses
> valores como NUMERIC(12,0) ou DECIMAL(12,0), então esses valores serão
> armazenados internamente como valores inteiros de 64 bits (BIGINT), ocupando
> apenas 8 bytes/caracteres, ou seja, uma economia de 1/3 (33%) de espaço em
> relação aos 12 bytes/caracteres.
> 
> Isso influencia não apenas no espaço gasto no armazenamento desses valores
> como também na velocidade das consultas, visto que são menos bytes a serem
> comparados.
> 
> De qualquer forma, é apenas uma sugestão.
> 
> Espero ter ajudado mais que atrapalhado. :D
> 
> 2009/6/8 Marcelo Moreira <marcelomoreira.souza em gmail.com>
> 
> > Pessoal,
> >
> > No firebird 2.1 vou precisar fazer um select em uma tabela que vai guardar
> > numeros por exemplo: '553184200001'
> > Estou na duvida se uso um campo do tipo:
> >
> > VARCHAR(12) ou
> > CHAR(12)
> >
> > Detalhe que este campo vai vai ser minha PK.
> >
> > Nesta situação qual seria a melhor escolha?
> >
> > Obrigado.
> >
> > Abraços!
> >
> > --
> > Marcelo Moreira
> > (31) 8420-2723
> > E-mail / MSN: marcelomoreira.souza em hotmail.com
> > E-mail: marcelomoreira.souza em gmail.com
> > Skype: marcelomoreira.souza
> > ______________________________________________
> > 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://firebase.com.br/pesquisa
> >
> ______________________________________________
> 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://firebase.com.br/pesquisa



Mais detalhes sobre a lista de discussão lista