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=#