Bacana Euler. Desconhecia essas classes de operadores ( xxx_pattern_ops). Gostei muito. Mas parece que eles aparecem só numa página no manual? ( http://www.postgresql.org/docs/current/static/indexes-opclass.html ).

De repente a gente pode jogar isso pra uma faq.

[]'s
- Walter

On 10/2/06, Euler Taveira de Oliveira <[EMAIL PROTECTED]> wrote:
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