Optimización de Consultas SQL
Continuando con el Proyecto de Inventarios, y habiendo subido los datos iniciales para probar la programación nos enfrentamos a dos formas distintas de obtener resultados de las tablas mediante consultas SQL.
Esto es importante, ya que mientras no domine la formación de consultas usando SQLAlchemy, debemos estar preparados para usar puro y simple SQL.
Debo indicar que solo he hecho dos intentos. En uno he usado OpenOffice para construir la consultar SQL y el otro es usando solamente la consola. Bueno, esto no es del todo cierto, pues para estos desarrollos uso el IDE Eclipse junto con una serie plugins como PyDev y QuantumDB.
La primera SQL query es la primera aproximación a una consulta con tablas relacionadas por sus índices, es bastante rápida, aunque como veremos más adelante esto no solo es relativo si no que puede mejorarse.
select a."txtSerie", b."txtUbicacion", c."txtInventario", c."txtNacional",
(select "txtBien" from "tblBien" where "idBien"=c."idBien") as "txtBien",
(select "txtMarca" from "tblBien" where "idBien"=c."idBien") as "txtMarca",
(select "txtModelo" from "tblBien" where "idBien"=c."idBien") as "txtModelo",
c."idBien"
from "tblMovimiento" as a
join "tblUbicacion" as b on a."idUbicacion" = b."idUbicacion"
join "tblEquipo" as c on a."txtSerie" = c."txtSerie"
where a."idUbicacion" = 10 and c."idBien" = 7
La segunda consulta la elaboré con la herramienta de base de datos de OpenOffice. Luego de configurar el acceso a PostgresSQL desde OpenOffice, use una herramienta visual para establecer las relaciones entre las tablas y arrastré los campos que me interesaba mostrar en el resultado de la consulta; esta es la consulta más rápida.
SELECT "tblMovimiento"."txtSerie",
"tblEquipo"."txtInventario",
"tblEquipo"."txtNacional",
"tblBien"."txtBien",
"tblBien"."txtMarca",
"tblBien"."txtModelo",
"tblBien"."descBien",
"tblCondicion"."txtCondicion",
"tblCondicion"."descCondicion",
"tblUbicacion"."idUbicacion",
"tblUbicacion"."txtUbicacion"
FROM "public"."tblMovimiento" "tblMovimiento",
"public"."tblTipoMovimiento" "tblTipoMovimiento",
"public"."tblEquipo" "tblEquipo",
"public"."tblBien" "tblBien",
"public"."tblCondicion" "tblCondicion",
"public"."tblUbicacion" "tblUbicacion"
WHERE ( "tblMovimiento"."idTipoMovimiento" = "tblTipoMovimiento"."idTipoMovimiento"
AND "tblMovimiento"."txtSerie" = "tblEquipo"."txtSerie"
AND "tblEquipo"."idBien" = "tblBien"."idBien"
AND "tblMovimiento"."idCondicion" = "tblCondicion"."idCondicion"
AND "tblMovimiento"."idUbicacion" = "tblUbicacion"."idUbicacion" )
AND "tblUbicacion"."idUbicacion"= 10
AND "tblBien"."idBien" = 7
Los resultados en la velocidad de respuesta muestran en general que la segunda consulta es más rápida, aunque por el cache de PostgreSQL en mas de una ocasión, la consulta hecha con subqueries resultó la del mejor desempeño.
Espero mejorar el desempeño de ambas consultas mas adelante, pero primero debo construir esta consulta usando expresiones de SQLAlchemy.
