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
 

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




Preguntas similares