Walter Cruz wrote:

> Não usou índice. (aliás, acho que faltou um order by na query que vc passou
> não?)
> 
> 
Consultas utilizando OR foram otimizadas no PostgreSQL 8.1. Então sugiro
que você utilize esta versão.
Outro comentário relevante, é que se você faz busca utilizando [I]LIKE,
crie um índice assim:

regression=# create index foo_idx2 on foo (fantasia
varchar_pattern_ops);

As classe de operadores (xxx_pattern_ops) é útil para consultas com
expressões regulares que não utilizam o idioma (locale) C. Assim, se
você utiliza o idioma (locale) pt_BR no banco de dados, crie os índices
acima nos dois campos para se beneficiar dos índices.

Sem os índices você tem o EXPLAIN assim:

regression=# explain select * from foo where razao like 'ghi%' or
fantasia like 'mno%';
                                    QUERY PLAN                                  
   
-----------------------------------------------------------------------------------
 Seq Scan on foo  (cost=0.00..11660.00 rows=22 width=32)
   Filter: (((razao)::text ~~ 'ghi%'::text) OR ((fantasia)::text ~~
'mno%'::text))
(2 registros)


O EXPLAIN de sua consulta após os índices fica assim:

regression=# explain select * from foo where razao like 'ghi%' or
fantasia like 'mno%';
                                                            QUERY PLAN          
                                                  
----------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on foo  (cost=4.13..87.45 rows=22 width=32)
   Recheck Cond: (((razao)::text ~~ 'ghi%'::text) OR ((fantasia)::text
~~ 'mno%'::text))
   Filter: (((razao)::text ~~ 'ghi%'::text) OR ((fantasia)::text ~~
'mno%'::text))
   ->  BitmapOr  (cost=4.13..4.13 rows=22 width=0)
         ->  Bitmap Index Scan on foo_idx  (cost=0.00..2.08 rows=13
width=0)
               Index Cond: (((razao)::text ~>=~ 'ghi'::character
varying) AND ((razao)::text ~<~ 'ghj'::character varying))
         ->  Bitmap Index Scan on foo_idx2  (cost=0.00..2.05 rows=9
width=0)
               Index Cond: (((fantasia)::text ~>=~ 'mno'::character
varying) AND ((fantasia)::text ~<~ 'mnp'::character varying))
(8 registros)

Perceba que ele faz busca por índices: foo_idx e foo_idx2. Veja a
diferença nos custos máximos (87.45 e 11660.00). Muito não?!


-- 
  Euler Taveira de Oliveira
  http://www.timbira.com/

_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a