Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Muchas veces al usarse JOINs traemos datos repetidos, y eso algunas veces es exagerado. Podemos usar UNION para minimizar el ancho de banda cuando se trabaje con uno o varios JOINs en una consulta. Para la demostración se usará las tablas Products y Categories de la histórica y muy conocida base de datos Northwind.

Bien, la siguiente consulta traerá las columnas (CategoryID, CategoryName, Description) de la tabla Categories y las columnas ProductID, ProductName y QuantityPerUnit de sus productos asociados. Para esto tenemos:

SELECT c.categoryid, c.categoryname, c.description,
p.productid, p.productname, p.quantityperunit
FROM products AS p
INNER JOIN categories c
ON p.categoryid = c.categoryid
WHERE c.categoryname = 'Seafood'
ORDER BY c.categoryid, p.productid 

Los resultados podemos verlo así:

Vemos en los resultados que se repiten demasiados datos... ¿Qué hacer para mejorar la consulta?, una alternativa es transformar la consulta anterior usando UNION, en algo mucho mejor y razonable, para obtener esto:

La consulta debe ser así:

SELECT 'Categoria' AS tipofila,
c.categoryid, c.categoryname, c.description
FROM categories c
WHERE c.categoryname = 'Seafood'
UNION ALL
SELECT 'Productos' AS tipofila,
p.productid, p.productname, p.quantityperunit
FROM categories c
INNER JOIN products p
ON p.categoryid = c.categoryid
WHERE c.categoryname = 'Seafood'
ORDER BY tipofila 

Aquí se está haciendo un uso óptimo del ancho de banda porque no hay datos repetidos para alguna columna de valores grandes, es más, la columnas "TipoFila" es opcional, pudiéndose optar por desecharlo, y entendiendo que la primera fila sería para los datos de la categoria.

Saludos Cordiales!,

Published 13/10/2007 23:55 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/10/13/usar-union-para-minimizar-el-ancho-de-banda-en-operaciones-joins.aspx

Comentarios

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

A mi modo de ver, esto haría que la programación para mostrar esos datos sea más compleja y por lo tanto atentaría contra la mantenibilidad.

Porque una línea de código vale más que mil palabras :D que dirías si te toca modificar un proyecto donde lees esto:

<asp:BoundColumn DataField="CategoryName" HeaderText="Product Name" />

Y lo mismo con CategoryId/Product ID.. en fin, para mí eso es complicar las cosas y la tecnología/infraestructura/hardware/etc hace que pasar unos bytes más por la red sea mucho mejor que el desarrollador ensucie el código y tenga que documentar de más cuando no hace falta.

Saludos.

Sunday, October 14, 2007 7:41 AM por Carlos Zanini

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

A mi parecer Percy hace un buen aporte, y no es necesariamente un llamado a hacer la programación más compleja, además muchas veces la programación se hace tan compleja como tanto experiencias tengas en ella.

Además el articulo no habla de bindear nada, ni de asp.net  ni nada, solo como recuperar datos de manera más eficaz.

eso!+

Sunday, October 14, 2007 7:55 AM por Gonzalo

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Conoces la construcción 'GROUP BY'?

Sunday, October 14, 2007 8:02 AM por Anonimo

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Hola  "Anonimo"...

Sinceramente no veo la necesidad de usar GROUP BY para este ejemplo en particular...  :-).

Saludos!,

Sunday, October 14, 2007 8:21 AM por Percy Reyes

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Gonzalo: los datos se recuperan para ser mostrados de alguna manera.. sino ni hagas el select :)

Entonces, a esos datos bindealos o iteralos con un while, for, o lo que más te guste y en el lenguaje que prefieras.. pero la programación y mantenibilidad de la aplicación van a sufrir un coste.

Y no importa cuanta experiencia tengas en programación ya que pensar sólo en uno mismo significa que no estás teniendo en cuenta que las aplicaciones pueden escalar y más personas se pueden sumar en el desarrollo (y ahí es donde importa la mantenibilidad y la documentación).

Saludos.

Sunday, October 14, 2007 9:06 AM por Carlos Zanini

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Entonces es que no entiendes GROUP BY.

Sunday, October 14, 2007 12:22 PM por Anonimo

# Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Post Cruzado de Geeks.ms Muchas veces al usarse JOINs traemos datos repetidos, y eso algunas veces es

Wednesday, October 17, 2007 8:38 AM por SQL Insider @ Comunidades Andinas

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Me parece excelente el aporte, no estoy de acuerdo con carloszanini, pienso que "el programador es para el código, no el código es para el programador", eso en contraste a la tan buscada "mantenibilidad", creo que mantener un software siempre es posible si existe la correcta documentación y metodología, de lo contrario no hay "una línea" que valga, si el performance es requerido por un volumen importante de datos simplemente esa la vía.

Sin embargo solo revisaría el ORDER BY porque si tienes más de una categoría en la consulta vas a tener las categorías arriba y los productos abajo, lo cual te va forzar recorrer el conjunto de datos más de lo necesario, creo que el ORDER BY es por "CategoryId, ProductId" y tienes que obligatoriamente sacar CategoryId en ambos SELECT.

Saludos.

Saturday, December 01, 2007 5:10 AM por José Angel

# re: Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Excelente aporte... en mi opinion es preferible el rendimiento y aprovechamiento de los recursos a costo de un par de lineas de codigo mas (las cuales pueden ser comentadas) que tener un codigo pequeño que al final represente una aplicacion deficiente y lenta...

Friday, June 13, 2008 9:54 PM por Armando