Em 27 de setembro de 2012 17:10,  <[email protected]> escreveu:
> Senhores, uma dúvida:
> Tenho a seguinte tabela :
>
> =#CREATE TABLE testxml
> (
>   doc xml,
>   id serial NOT NULL,
> );
>
> crio um INDEX:
>
> =#create  index doc_idx on testxml using btree (((xpath('/book/id/text()',
> doc))[1]::text));
>
> Criando este index, um select como este:
>
> =#SELECT (xpath('/book/id/text()', doc))[1]::text from testxml;
>
> Fica bem rápido. Mas o problema é:
>
> Este INDEX só é utilizado quando executo o SELECT acima. Para qualquer um
> xpath diferente, a consulta fica lenta.
>
> Como faço para criar um INDEX para que possa enviar uma consulta com
> qualquer outro nó dentro do xml?

Bem, indexar para qualquer sentença XPATH é impossível!

O que você pode fazer é uma solução de contorno, indexando cada coluna
do XML. Ou seja, criaria um índice '/book/id/text()', outro para
'/book/title/text()' e quantos mais. Ou optar por usar FTS [2], ou
ainda uma combinação disso.

O fato é que, para indexar um dado, você, necessariamente, precisa de
uma estrutura rígida, exatamente contrária ao que o XML se propõe.
Portanto use somente se os dados XML forem obedecer um padrão bem
definido.

Uma dica: na criação do indice você usou BTREE. Isso só funciona se
seu XML possuir um único campo (tag) chamado id (title, chapter, etc)
para o campo book. No XML não há restrinções, por isso a função XPATH
retorna um array. Nos casos que eu trabalho com XML crio os índices
com GIN [3] e utilizo os parâmetros para arrays [4] e FTS na cobertura
do bolo. :-)

1 - http://omgo.wordpress.com/2010/05/24/postgres-xml-indexes/
2 - http://www.postgresql.org/docs/9.2/static/textsearch.html
3 - http://www.postgresql.org/docs/9.2/static/gin.html
4 - http://www.postgresql.org/docs/9.2/static/functions-array.html

-- 
Marcone Peres - DBA
http://www.linkedin.com/in/marconeperes
@marconeperes
(61) 8146-0028
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a