Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Duda sobre rendimiento de un JOIN (https://www.clubdelphi.com/foros/showthread.php?t=61370)

David 05-11-2008 12:45:28

Duda sobre rendimiento de un JOIN
 
Hola

supongamos que tengo dos tablas en base de datos, Facturas y DetalleFacturas. La clave de facturas es el campo Factura (integer) y de DetalleFacturas es Factura y LineaFactura (ambos integer), en el campo Factura tengo un campo que puede ser Contabilizado, que está marcado como 1 si el departamento de contabilidad la ha procesado y 0 en caso contrario.

Quiero sacar por ejemplo, un listado de Articulos con su factura al lado, para las facturas donde Contabilizado = 1, decir que Articulo esta en el Detalle de Facturas.

Lo complico más la tabla Factura tiene el campo Cliente(integer), cuyo nombre se encuentra en la tabla EmpresaCliente, cuya clave primaria es Cliente, de tipo Integer, también quiero el nombre del cliente.

De estas dos formas de hacer la Query, ¿Cuál es más rápida y eficiente? Yo pienso que da igual una forma que otra, pero realmente no estoy seguro.

Código SQL [-]

SELECT D.FACTURA,D.ARTICULO,C.CLIENTENOMBRE
FROM DETALLEFACTURA D
INNER JOIN FACTURA F
ON (D.FACTURA=F.FACTURA) AND (F.CONTABILIZADO = 1)
INNER JOIN EMPRESACLIENTE C
ON (F.CLIENTE=C.CLIENTE)

o esta forma de hacerlo:

Código SQL [-]
SELECT D.FACTURA,D.ARTICULO,C.CLIENTENOMBRE
FROM DETALLEFACTURA D
INNER JOIN FACTURA F
ON (D.FACTURA=F.FACTURA) 
INNER JOIN EMPRESACLIENTE C
ON (F.CLIENTE=C.CLIENTE)
WHERE (F.CONTABILIZADO = 1)

Cómo veis de la primera forma, añado que las facturas contabilizadas sean 1, en la condición ON del JOIN, y de la segunda forma, lo añado en el Where del final.

Saludos

kuan-yiu 05-11-2008 16:04:57

En teoría el join es la operación más costosa en tiempo por lo que lo mejor es que el conjunto de tuplas que unes sea lo más limitado posible, todo lo que puedas sacar antes de hacer el join es menos tiempo para tu consulta.

Lepe 05-11-2008 18:23:02

framerobin es un manejador de bases de datos que incluye un "plan analyzer", deberías investigar por ese lado. Suponiendo que no uses paradox u otras tablas planas.

El motor de Bases de datos puede cambiar el plan de ejecución de una sql, basándose en muchos aspectos:
- orden de la consulta
- orden en que se ejecutan los inner joins
- campos seleccionados
- índices,
- etc.

duilioisola 05-11-2008 19:15:51

La segunda opción es la más elegante y según he leido en algún lugar: los campos para filtrar (en este caso f.contabilizado=1) deben estar en el where y los campos para unir en el join.

De todos modos, según la base de datos que utilices, una opción podrá darte mejores resultados que la otra.

También, puede ser que si tienes un índice que tenga en cuenta los campos factura y contabilizado a la vez, la consulta sea un poco más óptima. Del mismo modo, puede pasar lo contrario, si no tienes buenos índices para hacer el join.

David 06-11-2008 11:00:20

No lo he dicho, utilizo Firebird 1.5

Lepe 06-11-2008 14:49:05

entonces te gustará flamerobin.... al menos la opción que digo, para lo demás, está un poco verde, pero usable.

Saludos


La franja horaria es GMT +2. Ahora son las 16:03:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi