Optimizando Subqueries

03/07/2007 - 19:55 por Eng. Leandro Perez Guio | Informe spam
Saludos Colegas:

Tengo una disyuntiva de cual de los dos metodos es mas optimo a la hora de
la ejecucion. Incluso en el Execution Plan, fueron exactamente igual. A
continuacion expongo la consulta.

DECLARE @IdMarca int
DECLARE @IdTipoEquipo int
DECLARE @cModelo varchar(50)
DECLARE @cDescripcion varchar(100)
SET @IdMarca = 7
SET @IdTipoEquipo = -1
SET @cModelo = 'EC'
SET @cDescripcion = 'VID'

Select MOD.IdModelo, MOD.cModelo, MOD.cDescripcion, MOD.IdTipoEquipo,
MOD.IdMarca, MAR.cMarca, TEQ.cTipoEquipo FROM
_C_Modelos MOD INNER JOIN (SELECT * FROM _C_Marcas MAR WHERE (@IdMarca = -1
OR MAR.IdMarca = @IdMarca) )MAR ON MOD.IdMarca = MAR.IdMarca
INNER JOIN (SELECT * FROM _C_TipoEquipos TEQ WHERE (@IdTipoEquipo = -1 OR
TEQ.IdTipoEquipo = @IdTipoEquipo))TEQ ON MOD.IdTipoEquipo = TEQ.IdTipoEquipo

clasificadores
Select MOD.IdModelo, MOD.cModelo, MOD.cDescripcion, MOD.IdTipoEquipo,
MOD.IdMarca, MAR.cMarca, TEQ.cTipoEquipo FROM
_C_Modelos MOD INNER JOIN _C_Marcas MAR ON MOD.IdMarca = MAR.IdMarca
INNER JOIN _C_TipoEquipos TEQ ON MOD.IdTipoEquipo =
TEQ.IdTipoEquipo
WHERE (@IdMarca = -1 OR MAR.IdMarca = @IdMarca) AND (@IdTipoEquipo = -1 OR
TEQ.IdTipoEquipo = @IdTipoEquipo)

Ahora...cual de las dos es más optima????


Gracias anticipadas.

Leandro

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
03/07/2007 - 20:56 | Informe spam
Eng. Leandro Perez Guio,

Si dices que el plan de ejecucion es el mismo entonces debemos buscar una
tercera propuesta. Que tal si nos dices que tipo de data son las columnas:

- MAR.IdMarca
- TEQ.IdTipoEquipo

Por ejemplo, si son enteros, puedes usar esta via:

declare @minint int, @maxint int

SELECT @minint = convert(int, 0x80000000),
@maxint = convert(int, 0x7FFFFFFF)

select
MOD.IdModelo,
MOD.cModelo,
MOD.cDescripcion,
MOD.IdTipoEquipo,
MOD.IdMarca,
MAR.cMarca,
TEQ.cTipoEquipo
...
where
MAR.IdMarca between coalesce(@IdMarca, @minint) and coalesce(@IdMarca,
@maxint)
AND TEQ.IdTipoEquipo between coalesce(@IdTipoEquipo, @minint) and
coalesce(@IdTipoEquipo, @maxint)

Este metodo sera de uso si tienes un indice en [_C_Marcas] por [IdMarca] y
un indice en [_C_TipoEquipos] por [IdTipoEquipo]. Ademas de usar NULL en vez
de el valor -1 para indicar "TODOS" y que ambas columnas no acepten valores
NULL.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html

AMB


"Eng. Leandro Perez Guio" wrote:

Saludos Colegas:

Tengo una disyuntiva de cual de los dos metodos es mas optimo a la hora de
la ejecucion. Incluso en el Execution Plan, fueron exactamente igual. A
continuacion expongo la consulta.

DECLARE @IdMarca int
DECLARE @IdTipoEquipo int
DECLARE @cModelo varchar(50)
DECLARE @cDescripcion varchar(100)
SET @IdMarca = 7
SET @IdTipoEquipo = -1
SET @cModelo = 'EC'
SET @cDescripcion = 'VID'

Select MOD.IdModelo, MOD.cModelo, MOD.cDescripcion, MOD.IdTipoEquipo,
MOD.IdMarca, MAR.cMarca, TEQ.cTipoEquipo FROM
_C_Modelos MOD INNER JOIN (SELECT * FROM _C_Marcas MAR WHERE (@IdMarca = -1
OR MAR.IdMarca = @IdMarca) )MAR ON MOD.IdMarca = MAR.IdMarca
INNER JOIN (SELECT * FROM _C_TipoEquipos TEQ WHERE (@IdTipoEquipo = -1 OR
TEQ.IdTipoEquipo = @IdTipoEquipo))TEQ ON MOD.IdTipoEquipo = TEQ.IdTipoEquipo

clasificadores
Select MOD.IdModelo, MOD.cModelo, MOD.cDescripcion, MOD.IdTipoEquipo,
MOD.IdMarca, MAR.cMarca, TEQ.cTipoEquipo FROM
_C_Modelos MOD INNER JOIN _C_Marcas MAR ON MOD.IdMarca = MAR.IdMarca
INNER JOIN _C_TipoEquipos TEQ ON MOD.IdTipoEquipo =
TEQ.IdTipoEquipo
WHERE (@IdMarca = -1 OR MAR.IdMarca = @IdMarca) AND (@IdTipoEquipo = -1 OR
TEQ.IdTipoEquipo = @IdTipoEquipo)

Ahora...cual de las dos es más optima????


Gracias anticipadas.

Leandro



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida