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
