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