2008/7/31 Euler Taveira de Oliveira <[EMAIL PROTECTED]>

> William Leite Araújo escreveu:
> >      Posso dizer, por experiência própria, que o uso de numeric/decimal
> > só é indicado em casos onde a quantidade de registros é pequeno e/ou não
> > é usado em processamentos feito pelo banco de dados (qualquer fórmula
> > e/ou conversão).
> >
> Afirmação _sem_ fundamento.


    Ok. Vamos lá. Faça um teste Euler. Execute  *SELECT * FROM
[tabela]WHERE [tabela].[chave]
= '1.0'::NUMERIC;*

    De preferência em uma tabela onde hajam mais de 1000 registros. Em
seguida, execute a mesma consulta, mas comparando com um inteiro.

    Oh.... é muuuuuuuuuuuuito mais lenta. Porquê? A (excelente) documentação
explica:

The type numeric can store numbers with up to 1000 digits of precision and
perform calculations exactly. It is especially recommended for storing
monetary amounts and other quantities where exactness is required. However,
*arithmetic on numeric values is very slow compared to the integer types, or
to the floating-point types described in the next section. *

fonte:
http://www.postgresql.org/docs/8.2/interactive/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL

   Ainda sem fundamento?


>
>
> >      No ano passado, num processo de migração, converti o tipo
> > decimal(x,y) para o mesmo tipo no postgres, e ao trabalhar com campos
> > desse tipo em procedimentos, a migração de uma simples tabela de menos
> > de 500.000 registros durava mais de 20 horas. Ao converter esses campos
> > para inteiro (pois a parte decimal nem era usada), o tempo de
> > processamento caiu para 2 minutos. Isso mesmo! Na verdade deve ser menos
> > que 2 minutos... um absurdo, mas um caso real.
> >
> Qual a versão do PostgreSQL? Qual o SO? Duvido que a diferença seja
> *tão* discrepante assim mas você tem um script teste que mostre essa
> diferença?


   Para compor um único registro eram feitas em torno de 10 consultas dessa
forma, além das 2 consultas de auto-referência (na mesma tabela haviam,
eventualmente, o "pai" e a "mãe" do mesmo).

   Assim, os 378,998 registros, sem o cuidado de usar um cast para tipo
inteiro (primeira versão da função) demorou em torno de 20 horas. Após a
otimização foram menos de 2 minutos.

    Infelizmente não posso lhe mostrar os dados, mas GARANTO que, tanto num
8.2 quanto num 8.3, você poderá experimentar a diferença no tempo
simplesmente comparando uma constante numeric com uma constante integer.

-- 
William Leite Araújo
Analista de Banco de Dados - QualiConsult
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a