William Leite Araújo wrote:
> # select version();
>                                         version
> ----------------------------------------------------------------------------------------
>  PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 
> (Debian 4.2.3-2)
> 
> #select 1 from xmls_logs where xml_id = '534'::numeric;
>  ?column?
> ----------
>         1
> (1 registro)
> 
> Tempo: 34,068 ms
> mobile_card=# select 1 from xmls_logs where xml_id = '534';
>  ?column?
> ----------
>         1
> (1 registro)
> 
> Tempo: 1,475 ms
> 
> *   Bom, vamos mudar a ordem então:*
> 
> #select 1 from xmls_logs where xml_id = '534';
>  ?column?
> ----------
>         1
> (1 registro)
> 
> *Tempo: 4,725 ms*
> # select 1 from xmls_logs where xml_id = '534'::numeric;
>  ?column?
> ----------
>         1
> (1 registro)
> 
> *Tempo: 35,339 ms*
> 
>      Ok. Provavelmente meu servidor não possui otimizações. Mas é para 
> teste. É para não ter otimizações mesmo. Confesso que, para que o tempo 
> caísse tanto, aumentei a memória compartinhada e redizí as conexões 
> simultâneas. Mas o que estou tentando mostrar é o que está na documentação.
> 
>                                        Tabela "public.xmls_logs"
>       Coluna      |          Tipo          |                       
> Modificadores
> ------------------+------------------------+------------------------------------------------------------
>  xml_id           | integer                | not null default 
> nextval('xmls_logs_xml_id_seq'::regclass)
>  xml_xml_in       | text                   | not null
>  xml_xml_out      | text                   |
>  xml_dsc_tabel    | character varying(256) |
>  xml_int_tabel_id | integer                |
>  xml_dat_tstam    | date                   | not null default 
> ('now'::text)::date
>  xml_tim_tstam    | time without time zone | not null default 
> (now())::time without time zone
> Índices:
>     "pk_xmls_logs" PRIMARY KEY, btree (xml_id)


        Meu amigo, eu fiz aquilo tudo em meu desktop ubuntu com opções padrão 
do postgresql.

        Mas agora que mandou a estrutura, o erro está claro, o problema não é 
do tipo numeric.

        Você tem um campo em sua tabela com o tipo integer, quando você usa 
"select 1 from xmls_logs where xml_id = '534';" o postgresql consegue 
fazer o casting de string para inteiro e utilizar o índice (somente a 
partir da versão 8.0), mas...  o postgresql não faz casting automático 
de tipo numeric para inteiro (ainda bem que não faz) pois você perderia 
precisão dos dados, logo sua segunda consulta não utiliza o índice e por 
este motivo demora mais.

        Faça o explain das duas consultas que verá que uma vai utilizar o 
indice pk_xmls_logs e a segunda não.

        Como eu falei antes o erro é de modelagem e não do postGreSql, pois 
este trabalha muito bem com tipos numeric, mas ele não faz autocasting 
de numeric para integer, nem adivinha intenções obscuras.

ps: Por este motivo eu havia dito para não dar informações categóricas 
daquela forma na lista, existem usuários de PostGreSql de níveis bem 
diferentes por aqui, uns começando agora, outros já calejados. Espero 
que tenha ficado claro, PostGreSql não tem problemas com campos do tipo 
numeric, não perde performance na utilização deles. Se ainda restar 
alguma dúvida, icq: 71366121

        Abraço e boa sorte,

--
Shander Lyrio
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a