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