XMLTABLE en PostgreSQL 10

La versión 10 PostgreSQL trae entre sus funcionalidades la función XMLTBABLE para procesar XML y retornar una tabla como resultado, actividad que para hacerla antes de la versión 10 podía ser algo complejo y  lenta, pero gracias a la evolución del motor ya no es tan así :D.

Según la documentación, la sintaxis que muestra es muy limpia y en realidad luego de probarla te das cuenta que es muy beneficiosa, a continuación se muestra un ejemplo de su uso con el set de datos XML que puede encontrar aquí.

Ese set de datos XML se carga es una tabla llamada “tabla” con la estructura siguiente:


CREATE TABLE tabla (dato xml);

Y se viene la acción con XMLTABLE, para seleccionar los atributos O_ORDERKEY, O_CUSTKEY, O_TOTALPRICE, O_CLERK, del campo dato(xml) y retornarlo como una tabla.


SELECT tabla_xml.*
FROM tabla t,
XMLTABLE ('/table/T'
PASSING t.dato
COLUMNS O_ORDERKEY int PATH 'O_ORDERKEY',
O_CUSTKEY int PATH 'O_CUSTKEY',
O_TOTALPRICE real PATH 'O_TOTALPRICE',
O_CLERK text PATH 'O_CLERK') tabla_xml;

Con resultado:


o_orderkey | o_custkey | o_totalprice | o_clerk
------------+-----------+--------------+-----------------
1 | 370 | 172799 | Clerk#000000951
2 | 781 | 38426.1 | Clerk#000000880
3 | 1234 | 205654 | Clerk#000000955
4 | 1369 | 56000.9 | Clerk#000000124
5 | 445 | 105368 | Clerk#000000925
6 | 557 | 45523.1 | Clerk#000000058
7 | 392 | 271886 | Clerk#000000470

...

 

Para lograr algo similar con una versión previa a la PostgreSQL 10, se tenía que escribir algo como:


select unnest( xpath('/T/O_ORDERKEY/text()',fila::xml))::text::int as O_ORDERKEY,
unnest( xpath('/T/O_CUSTKEY/text()',fila::xml))::text::int as O_CUSTKEY,
unnest( xpath('/T/O_TOTALPRICE/text()',fila::xml))::text::numeric as O_TOTALPRICE,
unnest( xpath('/T/O_CLERK/text()',fila::xml))::text as O_CLERK from
(select unnest((xpath('/table/T',tabla.dato))) as fila from tabla) as resultado;

Lo cual a simple vista es mucho más complejo escribir con una sintaxis más compleja, lo cual es el primer punto a favor de la funcionalidad y otro punto a favor es el tiempo de respuesta, que con la nueva función se ejecuta 7 veces más rapido , al menos en mi set de datos que procesa un XML de 5 MB cargado en la tabla indicada previamente.

Se puede hacer algunas cosas más complejas las cuales puede ver en la documentación o en los siguientes enlaces, los cuales son los autores(Pavel Stehule, Álvaro Herrera) de la nueva funcionalidad:

XMLTABLE implementation is done

XMLTABLE in PostgreSQL

Gracias a ambos por la funcionalidad y otra vez más se puede ver como evoluciona PostgreSQL.

Nos vemos en otra 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s