Report Services: Optimización de consultas en los REport Models de

24/01/2007 - 12:51 por Maribel | Informe spam
Buenos dias,

Tengo una duda con relación a la Construcción de Modelos en Report Services.
La opción que estamos utitilizando es la construcción de un Report Model, de
forma que los usuarios finales se conecten a este y construyan sus propios
informes.

Tengo construido un Modelo en Estrella, o sea la tabla de hechos y alrededor
las dimensiones (si que va teniendo algunas cosillas de Copo de nieve, pero
es muy simple).
Mi duda es ¿Por qué me esta construyendo las consultas Report Services con
la opción de LEFT JOIN?
¿Sabes si en alguna parte de propiedades esa opción se especifica?.

Anexo el ejemplo de una consulta generada por Report Services y a
continuación la que creo más optima.

Informe donde quiero:
Código de Proyecto, Proyecto, Fecha Fin Proyecto.

SET DATEFIRST 7
SELECT DISTINCT
[VW_DM_PROJECT].[CD_PROYECTO] [CDPROYECTO],
[VW_DM_PROJECT].[PROYECTO] [PROYECTO],
[VW_DM_CRCT_TAREA].[FECHAFINPROYECTOREALFECHAFINPROYECTO]
[FECHAFINPROYECTOREALFECHAFINPROYECTO]
FROM
[dbo].[VW_DM_PROJECT] [VW_DM_PROJECT]
LEFT OUTER JOIN (
SELECT
[VW_DM_CRCT_TAREA].[DT_FIN_TAREA] [FECHAFINPROYECTOREALFECHAFINPROYECTO],
[VW_DM_CRCT_TAREA].[PROJ] [PROJ],
[VW_DM_CRCT_TAREA].[VER] [VER]
FROM
[dbo].[VW_DM_CRCT_TAREA] [VW_DM_CRCT_TAREA]
) [VW_DM_CRCT_TAREA] ON [VW_DM_PROJECT].[PROYECTO] =
[VW_DM_CRCT_TAREA].[PROJ] AND [VW_DM_PROJECT].[VERSION] =
[VW_DM_CRCT_TAREA].[VER]
LEFT OUTER JOIN (
SELECT
[VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO] [TIPOPROYECTO],
[VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO] [CD_TIPO_PROYECTO]
FROM
[dbo].[VW_TIPO_PROYECTO] [VW_TIPO_PROYECTO]
) [VW_TIPO_PROYECTO] ON [VW_DM_PROJECT].[CD_TIPO_PROY] =
[VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO]
LEFT OUTER JOIN (
SELECT
[VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO] [ESTADOPROYECTO],
[VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO] [CD_ESTADO_PROYECTO]
FROM
[dbo].[VW_ESTADO_PROYECTO] [VW_ESTADO_PROYECTO]
) [VW_ESTADO_PROYECTO] ON [VW_DM_PROJECT].[CD_ESTD_PROY] =
[VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO]
WHERE
[VW_TIPO_PROYECTO].[TIPOPROYECTO] = 'PROY_DES'
AND [VW_ESTADO_PROYECTO].[ESTADOPROYECTO] = 'PT'
ORDER BY
[CDPROYECTO], [PROYECTO], [FECHAFINPROYECTOREALFECHAFINPROYECTO]

SELECT
A.CD_PROYECTO,
A.PROYECTO,
D.DT_FIN_TAREA
FROM
dbo.VW_DM_PROJECT A INNER JOIN dbo.DM_TIPO_PROYECTO B
ON A.CD_TIPO_PROY = B.CD_TIPO_PROYECTO
INNER JOIN dbo.DM_ESTADO_PROYECTO C
ON A.CD_ESTD_PROY = C.CD_ESTADO_PROYECTO
INNER JOIN dbo.VW_DM_CRCT_TAREA D
ON A.CD_PROYECTO = D.PROJ
AND A.VERSION= D.VER
WHERE B.CD_TIPO_PROYECTO = 'PROY_DES'
AND C.CD_ESTADO_PROYECTO = 'PT'

Un Saludo, gracias
Maribel
 

Leer las respuestas

#1 Maribel
25/01/2007 - 09:47 | Informe spam
Hola Gustavo,
Si que he analizado / comparado las dos consultas.
No soy experta en SQL Server, tengo más conocimientos de Tunning sobre BBDD
Oracle y Teradata, por tanto de acuerdo a esos conocimientos no esta siendo
optima la primera consulta sobre todo utilizando el LEFT Join.
También existe el teste de ejecucción la primera "tarda más de 1h" con lo
cual tendría que dejarla programada y la segunda en 1'36'' tengo la
respuesta.

La herramienta Visual Studio 2005, permite la creación de Report Models,
creo que en alguna parte habria que indicarle si LEFT o INNER, pero no tengo
certeza donde ser haria eso, o realmente por defecto esta configurada para
LEFT.

Un saludo
Maribel


Para decidir cuál es la consulta óptima, deberías analizar el plan de
ejecución de cada una de las consultas.

Lo has hecho?

Gustavo Larriera, MVP
Solid Quality Mentors [www.solidq.com]
Este mensaje se proporciona tal como es, sin garantías de ninguna clase

"Maribel" wrote:

> Buenos dias,
>
> Tengo una duda con relación a la Construcción de Modelos en Report Services.
> La opción que estamos utitilizando es la construcción de un Report Model, de
> forma que los usuarios finales se conecten a este y construyan sus propios
> informes.
>
> Tengo construido un Modelo en Estrella, o sea la tabla de hechos y alrededor
> las dimensiones (si que va teniendo algunas cosillas de Copo de nieve, pero
> es muy simple).
> Mi duda es ¿Por qué me esta construyendo las consultas Report Services con
> la opción de LEFT JOIN?
> ¿Sabes si en alguna parte de propiedades esa opción se especifica?.
>
> Anexo el ejemplo de una consulta generada por Report Services y a
> continuación la que creo más optima.
>
> Informe donde quiero:
> Código de Proyecto, Proyecto, Fecha Fin Proyecto.
>
> SET DATEFIRST 7
> SELECT DISTINCT
> [VW_DM_PROJECT].[CD_PROYECTO] [CDPROYECTO],
> [VW_DM_PROJECT].[PROYECTO] [PROYECTO],
> [VW_DM_CRCT_TAREA].[FECHAFINPROYECTOREALFECHAFINPROYECTO]
> [FECHAFINPROYECTOREALFECHAFINPROYECTO]
> FROM
> [dbo].[VW_DM_PROJECT] [VW_DM_PROJECT]
> LEFT OUTER JOIN (
> SELECT
> [VW_DM_CRCT_TAREA].[DT_FIN_TAREA] [FECHAFINPROYECTOREALFECHAFINPROYECTO],
> [VW_DM_CRCT_TAREA].[PROJ] [PROJ],
> [VW_DM_CRCT_TAREA].[VER] [VER]
> FROM
> [dbo].[VW_DM_CRCT_TAREA] [VW_DM_CRCT_TAREA]
> ) [VW_DM_CRCT_TAREA] ON [VW_DM_PROJECT].[PROYECTO] =
> [VW_DM_CRCT_TAREA].[PROJ] AND [VW_DM_PROJECT].[VERSION] =
> [VW_DM_CRCT_TAREA].[VER]
> LEFT OUTER JOIN (
> SELECT
> [VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO] [TIPOPROYECTO],
> [VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO] [CD_TIPO_PROYECTO]
> FROM
> [dbo].[VW_TIPO_PROYECTO] [VW_TIPO_PROYECTO]
> ) [VW_TIPO_PROYECTO] ON [VW_DM_PROJECT].[CD_TIPO_PROY] =
> [VW_TIPO_PROYECTO].[CD_TIPO_PROYECTO]
> LEFT OUTER JOIN (
> SELECT
> [VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO] [ESTADOPROYECTO],
> [VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO] [CD_ESTADO_PROYECTO]
> FROM
> [dbo].[VW_ESTADO_PROYECTO] [VW_ESTADO_PROYECTO]
> ) [VW_ESTADO_PROYECTO] ON [VW_DM_PROJECT].[CD_ESTD_PROY] =
> [VW_ESTADO_PROYECTO].[CD_ESTADO_PROYECTO]
> WHERE
> [VW_TIPO_PROYECTO].[TIPOPROYECTO] = 'PROY_DES'
> AND [VW_ESTADO_PROYECTO].[ESTADOPROYECTO] = 'PT'
> ORDER BY
> [CDPROYECTO], [PROYECTO], [FECHAFINPROYECTOREALFECHAFINPROYECTO]
>
> SELECT
> A.CD_PROYECTO,
> A.PROYECTO,
> D.DT_FIN_TAREA
> FROM
> dbo.VW_DM_PROJECT A INNER JOIN dbo.DM_TIPO_PROYECTO B
> ON A.CD_TIPO_PROY = B.CD_TIPO_PROYECTO
> INNER JOIN dbo.DM_ESTADO_PROYECTO C
> ON A.CD_ESTD_PROY = C.CD_ESTADO_PROYECTO
> INNER JOIN dbo.VW_DM_CRCT_TAREA D
> ON A.CD_PROYECTO = D.PROJ
> AND A.VERSION= D.VER
> WHERE B.CD_TIPO_PROYECTO = 'PROY_DES'
> AND C.CD_ESTADO_PROYECTO = 'PT'
>
> Un Saludo, gracias
> Maribel
>

Preguntas similares