Sobre vistas indexadas, campos calculados, etc...

07/07/2007 - 11:19 por Juan Diego Bueno | Informe spam
Bueno, yo sigo con mi intento de vista indexada para resolver situaciones de
campos calculados sin necesidad de usar triggers.

Intento hacer la siguiente consulta:

CREATE VIEW VISTA_PROYECTOS_BASE WITH SCHEMABINDING

AS

SELECT SUM(ISNULL(A.IMPORTE,0)) AS PRESUPUESTO, P.COD_PROYECTO, NEMO_PROY,
COD_DPTO, COUNT_BIG(*) AS CUENTA FROM DBO.SQL_PROYECTOS P

LEFT OUTER JOIN DBO.SQL_ANUALIDADES A ON P.COD_PROYECTO=A.COD_PROYECTO

GROUP BY P.COD_PROYECTO, NEMO_PROY, COD_DPTO

GO


CREATE UNIQUE CLUSTERED INDEX IDX_COD_PROYECTO ON
dbo.VISTA_PROYECTOS_BASE(COD_PROYECTO, COD_DPTO)

El mensaje de error es:

No se puede crear índice en la vista "GEST_PRO.dbo.VISTA_PROYECTOS_BASE"
porque utiliza una combinación LEFT, RIGHT o FULL OUTER y no se permiten
combinaciones OUTER en vistas indizadas. Considere el uso de una combinación
INNER en su lugar.

Otra alternativa era usar una subconsulta, pero tampoco va, y la sugerencia
de SQL Server es: No lo uses... Lo que pasa es que no todos los proyectos
tienen por que tener anualidades, y yo los necesito todos

La vista trae muchos más datos, tengo que hacer mínimo otro left join sobre
un campo calculado que hace referencia a otra tabla, y además necesito tomar
de otras tablas campos convencionales también usando un outer

¿Qué puedo hacer al respecto?

Saludos

Preguntas similare

Leer las respuestas

#1 Ricardo Passians
07/07/2007 - 13:52 | Informe spam
De nuevo, dividir el problema :)

Yo pienso que no debes tratar de tener todo eso en una sola vista indexada,
ya que como has visto éstas tienen sus limitantes.
Crea la vista indexada (o indizada) sobre una sola tabla (ej. la tabla
SQL_ANUALIDADES) o sobre varias tablas en relación INNER y luego crea una
nueva vista (normal no indexada) que haga un LEFT JOIN de los proyectos
hacia esa vista indizada (la cual tratarás como si fuese una simple tabla).
El resultado será el mismo que buscas.

Se entiende la idea?

Saludos

Ricardo Passians



"Juan Diego Bueno" escribió en el mensaje
news:
Bueno, yo sigo con mi intento de vista indexada para resolver situaciones
de campos calculados sin necesidad de usar triggers.

Intento hacer la siguiente consulta:

CREATE VIEW VISTA_PROYECTOS_BASE WITH SCHEMABINDING

AS

SELECT SUM(ISNULL(A.IMPORTE,0)) AS PRESUPUESTO, P.COD_PROYECTO, NEMO_PROY,
COD_DPTO, COUNT_BIG(*) AS CUENTA FROM DBO.SQL_PROYECTOS P

LEFT OUTER JOIN DBO.SQL_ANUALIDADES A ON P.COD_PROYECTO=A.COD_PROYECTO

GROUP BY P.COD_PROYECTO, NEMO_PROY, COD_DPTO

GO


CREATE UNIQUE CLUSTERED INDEX IDX_COD_PROYECTO ON
dbo.VISTA_PROYECTOS_BASE(COD_PROYECTO, COD_DPTO)

El mensaje de error es:

No se puede crear índice en la vista "GEST_PRO.dbo.VISTA_PROYECTOS_BASE"
porque utiliza una combinación LEFT, RIGHT o FULL OUTER y no se permiten
combinaciones OUTER en vistas indizadas. Considere el uso de una
combinación INNER en su lugar.

Otra alternativa era usar una subconsulta, pero tampoco va, y la
sugerencia de SQL Server es: No lo uses... Lo que pasa es que no todos los
proyectos tienen por que tener anualidades, y yo los necesito todos

La vista trae muchos más datos, tengo que hacer mínimo otro left join
sobre un campo calculado que hace referencia a otra tabla, y además
necesito tomar de otras tablas campos convencionales también usando un
outer

¿Qué puedo hacer al respecto?

Saludos




Respuesta Responder a este mensaje
#2 Juan Diego Bueno
07/07/2007 - 14:42 | Informe spam
"Ricardo Passians" escribió en el mensaje
news:%23pcV$
De nuevo, dividir el problema :)

Yo pienso que no debes tratar de tener todo eso en una sola vista
indexada, ya que como has visto éstas tienen sus limitantes.
Crea la vista indexada (o indizada) sobre una sola tabla (ej. la tabla
SQL_ANUALIDADES) o sobre varias tablas en relación INNER y luego crea una
nueva vista (normal no indexada) que haga un LEFT JOIN de los proyectos
hacia esa vista indizada (la cual tratarás como si fuese una simple
tabla). El resultado será el mismo que buscas.

Se entiende la idea?



Se entiende, se entiende... Lo suyo entonces es, no solo crear la vista
indexada sobre anualidades, sino que esa vista ya devuelva la suma de
anualidades agrupada por código de proyecto, y hacer el join sobre ella, más
que hacer la suma en la vista convencional. Doy por hecho que así sacaría
partido a las ventajas de la vista indexada

Saludos
Respuesta Responder a este mensaje
#3 Ricardo Passians
07/07/2007 - 15:05 | Informe spam

que hacer la suma en la vista convencional. Doy por hecho que así sacaría
partido a las ventajas de la vista indexada




Claro que sí. Debes ver la vista indexada como si fuese una tabla
resumida. Lo es de hecho porque sus datos resumidos persisten en la BD, es
decir no tiene que materializarse cada vez, como lo hacen las vistas
convencionales. De ahí que, a pesar de sus limitantes y aunque no sean
recomendables en algunos casos, aporten gran ventaja en el performace de las
queries de agregados.


Saludos

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