Velocidad de ejecución

17/09/2003 - 10:21 por Alberto | Informe spam
Después de realizar el producto cartesiano de dos tablas del siguiente modo:

use northwind
select *
from customers, orders

observo que tarda cierto tiempo en ofrecer la respuesta pero lo que me llama
poderosamente la atención es que si hago lo siguiente:

use northwind
select *
from customers c
inner join orders o
on c.customerid = o.customerid

tarda menos tiempo en resolverlo cuando (me imagino) internamente tiene que
hacer el producto cartesiano y después filtrar filas.
¿Alguien conoce la explicación?

Gracias.

Preguntas similare

Leer las respuestas

#1 Yolanda Herrero
17/09/2003 - 11:58 | Informe spam
Esto:

use northwind
select *
from customers, orders



te devuelve miles de filas, para obtener el mismo resultado en ambas
instrucciones lo tienes que hacer así:

select *
from customers c, orders o
where c.customerid = o.customerid

y el rendimiento es parecido.

Saludos
Respuesta Responder a este mensaje
#2 Alberto
17/09/2003 - 12:09 | Informe spam
Igual no me expresé bien.

La select que me envías es igual que la segunda que expuse yo pero tu unes
las tablas con la cláusula where y yo lo hago con un inner join.

Lo que pregunto es que para juntar los clientes con sus pedidos hay que
hacer el producto cartesiano y después eliminar filas que no cumplan una
restricción (lo que tu pones en el where) y lo que me extraña es que si sólo
se hace el producto cartesiano (teóricamente es menos trabajo) tarda más en
hacerlo.

"Yolanda Herrero" escribió en el mensaje
news:uBa%

Esto:

> use northwind
> select *
> from customers, orders

te devuelve miles de filas, para obtener el mismo resultado en ambas
instrucciones lo tienes que hacer así:

select *
from customers c, orders o
where c.customerid = o.customerid

y el rendimiento es parecido.

Saludos


Respuesta Responder a este mensaje
#3 Yolanda Herrero
17/09/2003 - 12:28 | Informe spam
Si haces esto:

select *
from customers, orders

te va a devolver una fila con los datos de cada cliente más los datos de
cada uno de los pedidos, aunque no sean del cliente con el que aparece.

Si suponemos que tienes 80 clientes y 100 pedidos te devolverá 80 registros
por cada pedido, es decir, 8000 registros.

Si pones la sentencia de abajo o un join, te devolvería los 100 pedidos con
sus correspondientes clientes, es decir 100 registros:

select *
from customers c, orders o
where c.customerid = o.customerid

¿Crees que es igual de costoso devolver 8000 registros que 100? Los
resultados de ambas sentencias son totalmente distintos, en una devuelve
muchas más filas que en la otra, ahí está la diferencia de rendimiento.

Saludos.


"Alberto" escribió en el mensaje
news:
Igual no me expresé bien.

La select que me envías es igual que la segunda que expuse yo pero tu unes
las tablas con la cláusula where y yo lo hago con un inner join.

Lo que pregunto es que para juntar los clientes con sus pedidos hay que
hacer el producto cartesiano y después eliminar filas que no cumplan una
restricción (lo que tu pones en el where) y lo que me extraña es que si


sólo
se hace el producto cartesiano (teóricamente es menos trabajo) tarda más


en
hacerlo.

"Yolanda Herrero" escribió en el mensaje
news:uBa%
>
> Esto:
>
> > use northwind
> > select *
> > from customers, orders
>
> te devuelve miles de filas, para obtener el mismo resultado en ambas
> instrucciones lo tienes que hacer así:
>
> select *
> from customers c, orders o
> where c.customerid = o.customerid
>
> y el rendimiento es parecido.
>
> Saludos
>
>


Respuesta Responder a este mensaje
#4 Rubén Vigón
17/09/2003 - 12:34 | Informe spam
Lo que ocurre es que si utilizas un producto cartesiano (es decir, no utilizas INNER JOIN o un WHERE
por el campo de relación) cada registro de la tabla Clientes "enlazaría" con todos y cada uno de los
registros de la tabla Pedidos, en lugar de enlazar sólo con "sus" pedidos, lo que genera un volumen
de registros MUY superior

Por ejemplo, supongamos 5 clientes con 8 pedidos cada uno

SELECT * FROM Clientes, Pedidos
Devolvería 200 registros (5 registros de la tabla Clientes* 40 registros de la tabla Pedidos)
Incorrecto!

SELECT * FROM Clientes INNER JOIN Pedidos ON Clientes.IdCliente = Pedidos.IdCliente
Devolvería sólo 40 registros (correcto!)

Además, no sólo se obtiene un volumen de registros muy superior, sino que gran parte de éstos
registros serían "incorrectos", ya que mostrarían pedidos de otros clientes

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
Respuesta Responder a este mensaje
#5 Alberto
17/09/2003 - 12:46 | Informe spam
Insisto, creo que no me estais entendiendo.

Que el producto cartesiano devuelve muchísimas más filas (75530 en concreto)
por 830 cuando se hace la unión de clientes con sus pedidos ya lo sé.
La pregunta es: ¿cómo une sql server las filas de las dos tablas cuando se
hace el inner join? ¿no tiene que juntar todas las filas con todas y después
eliminar las que no coincidan (clientes con sus pedidos)?


"Rubén Vigón" escribió en el mensaje
news:%
Lo que ocurre es que si utilizas un producto cartesiano (es decir, no


utilizas INNER JOIN o un WHERE
por el campo de relación) cada registro de la tabla Clientes "enlazaría"


con todos y cada uno de los
registros de la tabla Pedidos, en lugar de enlazar sólo con "sus" pedidos,


lo que genera un volumen
de registros MUY superior

Por ejemplo, supongamos 5 clientes con 8 pedidos cada uno

SELECT * FROM Clientes, Pedidos
Devolvería 200 registros (5 registros de la tabla Clientes* 40 registros


de la tabla Pedidos)
Incorrecto!

SELECT * FROM Clientes INNER JOIN Pedidos ON Clientes.IdCliente Pedidos.IdCliente
Devolvería sólo 40 registros (correcto!)

Además, no sólo se obtiene un volumen de registros muy superior, sino que


gran parte de éstos
registros serían "incorrectos", ya que mostrarían pedidos de otros


clientes

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida