Extraño plan ejecución

25/08/2006 - 12:19 por Alvaro Mosquera | Informe spam
¿ Por qué en una query que tiene un left join, el plan de ejecución ejecuta
un inner join ?.
Obviamente los resultados no son los correctos.

Adjunto la query y el plan de ejecución.

La query

select c.codigoproducto,d.codigoproducto
from componentes c
left outer join historicodosificaciones d on c.codigoformula =
d.codigoformula and c.extension = d.extension and
c.codigoproducto = d.codigoproducto
where c.codigoformula = '412761' and c.extension = '6150' and d.diario =
'24/08/2006' and d.nromezcladia = 107

Plan de ejecución

|--Hash Match(Inner Join,
HASH:([d].[CodigoProducto])=([c].[CodigoProducto]),
RESIDUAL:([d].[CodigoProducto]=[c].[CodigoProducto]))
|--Clustered Index
Seek(OBJECT:([Trazas].[dbo].[HistoricoDosificaciones].[IX_HistoricoDosificaciones]
AS [d]), SEEK:([d].[Diario]='Ago 24 2006 12:00AM' AND
[d].[NroMezclaDia]7), WHERE:([d].[Extension]='6150' AND
[d].[CodigoFormula]='412761') ORDERED FORWARD)
|--Clustered Index
Scan(OBJECT:([Trazas].[dbo].[Componentes].[PK_Componentes] AS [c]),
WHERE:([c].[CodigoFormula]='412761' AND [c].[Extension]='6150'))
 

Leer las respuestas

#1 Eladio Rincón
25/08/2006 - 12:33 | Informe spam
Hola,

al aplicar un predicado where "inconscientemente" estás convirtiendo la
consulta en INNER JOIN.

para ello en las columnas incluidas en el predicado del alias d deberías
añadir or d.columna is null


mira el siguiente ejemplo:


use tempdb
go
drop table dbo.t
go
create table dbo.t (id1 int, id2 int)
go
insert dbo.t select 1, 1
insert dbo.t select 2, null
insert dbo.t select 3, 0
go

select *
from dbo.t t1
left join dbo.t t2
on t1.id1 = t2.id2
go

select *
from dbo.t t1
left join dbo.t t2
on t1.id1 = t2.id2
where t2.id2 = 1
go

select *
from dbo.t t1
left join dbo.t t2
on t1.id1 = t2.id2
where t2.id2 = 1 or t2.id2 is null



Saludos,

Eladio Rincón,
http://www.siquelnet.com

"Alvaro Mosquera" wrote in
message news:
¿ Por qué en una query que tiene un left join, el plan de ejecución ejecuta
un inner join ?.
Obviamente los resultados no son los correctos.

Adjunto la query y el plan de ejecución.

La query

select c.codigoproducto,d.codigoproducto
from componentes c
left outer join historicodosificaciones d on c.codigoformula > d.codigoformula and c.extension = d.extension and
c.codigoproducto = d.codigoproducto
where c.codigoformula = '412761' and c.extension = '6150' and d.diario
> '24/08/2006' and d.nromezcladia = 107

Plan de ejecución

|--Hash Match(Inner Join,
HASH:([d].[CodigoProducto])=([c].[CodigoProducto]),
RESIDUAL:([d].[CodigoProducto]=[c].[CodigoProducto]))
|--Clustered Index
Seek(OBJECT:([Trazas].[dbo].[HistoricoDosificaciones].[IX_HistoricoDosificaciones]
AS [d]), SEEK:([d].[Diario]='Ago 24 2006 12:00AM' AND
[d].[NroMezclaDia]7), WHERE:([d].[Extension]='6150' AND
[d].[CodigoFormula]='412761') ORDERED FORWARD)
|--Clustered Index
Scan(OBJECT:([Trazas].[dbo].[Componentes].[PK_Componentes] AS [c]),
WHERE:([c].[CodigoFormula]='412761' AND [c].[Extension]='6150'))


Preguntas similares