5.1. Consultas

Las consultas a la base de datos se realizan con el comando select, que se implementa en PostgreSQL cumpliendo en gran parte con el estándar SQL:

 

Notación
Omitiremos las referencias comunes a SQL y sólo se mostrarán algunas de las posibilidades de consulta con PostgreSQL. Por lo que res- pecta a las funciones auxiliares, se han visto algunas en el apartado de tipos de datos y, en todo caso, se recomienda la consulta de la documentación del producto para las  operaciones más avanzadas.


demo=# select parte, tipo demo-# from productos demo-# where psugerido > 30 demo-# order by parte demo-# limit 5 demo-# offset 3; parte | tipo ------------+---------- Monitor | 1024x876 Monitor | 1024x876 Procesador | 2.4 GHz Procesador | 1.7 Procesador | 3 GHz (5 rows)

 


Al igual que MySQL, PostgreSQL admite la sentencia explain delante de select para examinar qué está ocurriendo durante una consulta:

Al igual que en el módulo de MySQL, vemos que no aprovecha los índices (básicamente porque no tenemos ninguno definido).


demo=# explain select productos.clave, parte||´`||tipo||´`||especificación as producto, proveedores.empresa , precio from productos natural join precios natural join proveedores; QUERY PLAN -------------------------------------------------------------------------------- Hash Join (cost=45.00..120.11 rows=1000 width=104) Hash Cond: (("outer".empresa)::text = ("inner".empresa)::text) -> Hash Join (cost=22.50..72.61 rows=1000 width=104) Hash Cond: ("outer".clave = "inner".clave) -> Seq Scan on precios (cost=0.00..20.00 rows=1000 width=32) -> Hash (cost=20.00..20.00 rows=1000 width=76) -> Seq Scan on productos (cost=0.00..20.00 rows=1000 width=76) -> Hash (cost=20.00..20.00 rows=1000 width=24) -> Seq Scan on proveedores (cost=0.00..20.00 rows=1000 width=24) (9 rows) demo=#

 

Veamos como mejorar el rendimiento de este select:


demo=# create index empresa_idx on precios (empresa); CREATE INDEX demo=# create index clave_idx on precios (clave); CREATE INDEX demo=# explain select productos.clave, parte||´ `||tipo||´ `||especificación as producto, proveedores.empresa , precio from productos natural join precios natural join proveedores; QUERY PLAN -------------------------------------------------------------------------------- Hash Join (cost=29.00..56.90 rows=20 width=104) Hash Cond: ("outer".clave = "inner".clave) ->Seq Scan on productos (cost=0.00..20.00 rows=1000 width=76) -> Hash (cost=28.95..28.95 rows=20 width=32) -> Hash Join (cost=1.25..28.95 rows=20 width=32) Hash Cond: (("outer".empresa)::text = ("inner".empresa)::text) -> Seq Scan on proveedores (cost=0.00..20.00 rows=1000 width=24) -> Hash (cost=1.20..1.20 rows=20 width=32) -> Seq Scan on precios (cost=0.00..1.20 rows=20 width=32) (9 rows) demo=#