Mi primera vista indexada

16/03/2005 - 01:04 por Danilsa | Informe spam
He creado una vista indexada (mi primera :)) leyendo los datos de los BOL
y consultas del foro:

Tengo una tabla MOVIMIENTO (cuenta char(15),fecha smalldatetime ,debito
numeric(16,2),credito numeric(16,2)) /*una tabla de movimientos contables
por cuenta,fecha y su debito o credito*/

La razon de la vista es tener un resumen por mes y por cuenta del total de
debitos y total de creditos de cada cuenta. Se debe a que constantemente
piden reportes mensuales, bimestrales, trimestrales, estadisticas mensuales,
promedios etc. de estos balances.

Esta es la vista. Lo de schemabinding y demas cosas lo descubri despues de
decenas de intentos y lecturas:

*es una salida a un script*

CREATE VIEW dbo.vBALANCE
WITH SCHEMABINDING
AS
SELECT DATEPART([YEAR], fecha) AS ano, DATEPART([MONTH], fecha) AS mes,
cuenta,
SUM(debito) AS debitos, SUM(credito) AS creditos, COUNT_BIG (*) AS CNT
FROM dbo.MOVIMIENTO
GROUP BY DATEPART([YEAR], fecha), DATEPART([MONTH], fecha), cuenta


Luego el indice agrupado:

CREATE UNIQUE CLUSTERED INDEX [AnoMesCuenta] ON [dbo].[vBALANCE]([ano],
[mes], [cuenta]) ON [PRIMARY]

Mis preguntas son:
1) Por que para que me permitiera crear el indice agrupado tuve que ponerle
COUNT_BIG(*) ? Lo puse porque lo dice en los bol's pero no dice o no vi
clara la razon. A que se debe ? Cada vista indexada necesita eso ?

2) Segun vi en la ayuda, con solo crear el indice hace que la vista "resida"
fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que hago
referencia a esta vista, no se expande en ese momento ? o sea que es como si
fuera un trigger ?

3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
rendimiento ? seria o no preferible tener columnas que guarden año y mes
directamente en la tabla MOVIMIENTO ?

4) En sentido general esta vista habra de funcionar eficientemente bien ?
Hay alguna otra manera de definirla que sea mas eficiente ?

Mil gracias.

Danilsa Jimenez
Panama

Preguntas similare

Leer las respuestas

#1 Ricardo Passians
16/03/2005 - 14:04 | Informe spam
Para mí tu vista indizada no está nada mal diseñada.

2) Segun vi en la ayuda, con solo crear el indice hace que la vista


"resida"
fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que hago
referencia a esta vista, no se expande en ese momento ? o sea que es como


si
fuera un trigger ?




Se almacenan en la BD como si fuesen tablas con la gran ventaja que se
mantienen actualizadas en línea automáticamente. Esa es la gran ventaja.
Reemplaza la necesidad de un trigger para lo mismo y lo supera en integridad
y necesidad de mantenimiento. Hay varios mensajes que hablan del tema.

3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
rendimiento ? seria o no preferible tener columnas que guarden año y mes
directamente en la tabla MOVIMIENTO ?




No veo problema en uso de datepart. Es una funcion muy simple y de poco
overhead.


4) En sentido general esta vista habra de funcionar eficientemente bien ?
Hay alguna otra manera de definirla que sea mas eficiente ?




Para el proposito que expresas de tener rapidamente los balances mensuales,
yo la veo adecuada. Pero, como siempre, lo mejor es evaluar el rendimiento
ya en producción con datos reales.
Respuesta Responder a este mensaje
#2 José Antonio
16/03/2005 - 14:10 | Informe spam
Y que pasa cuando en tu tabla movimientos tengas 500.000 o 1 millon de
filas?

La vista se actualiza por cada fila insertada, anulada o modificada y
recalcula cada vez que se hace todas las filas de movimientos?

Si esto es asi el rendimiento del servidor creo que seria bastante malo.

Estoy equivocado?

Saludos.
"Danilsa" escribió en el mensaje
news:
He creado una vista indexada (mi primera :)) leyendo los datos de los
BOL
y consultas del foro:

Tengo una tabla MOVIMIENTO (cuenta char(15),fecha smalldatetime ,debito
numeric(16,2),credito numeric(16,2)) /*una tabla de movimientos contables
por cuenta,fecha y su debito o credito*/

La razon de la vista es tener un resumen por mes y por cuenta del total de
debitos y total de creditos de cada cuenta. Se debe a que constantemente
piden reportes mensuales, bimestrales, trimestrales, estadisticas
mensuales,
promedios etc. de estos balances.

Esta es la vista. Lo de schemabinding y demas cosas lo descubri despues
de
decenas de intentos y lecturas:

*es una salida a un script*

CREATE VIEW dbo.vBALANCE
WITH SCHEMABINDING
AS
SELECT DATEPART([YEAR], fecha) AS ano, DATEPART([MONTH], fecha) AS
mes,
cuenta,
SUM(debito) AS debitos, SUM(credito) AS creditos, COUNT_BIG (*) AS CNT
FROM dbo.MOVIMIENTO
GROUP BY DATEPART([YEAR], fecha), DATEPART([MONTH], fecha), cuenta


Luego el indice agrupado:

CREATE UNIQUE CLUSTERED INDEX [AnoMesCuenta] ON [dbo].[vBALANCE]([ano],
[mes], [cuenta]) ON [PRIMARY]

Mis preguntas son:
1) Por que para que me permitiera crear el indice agrupado tuve que
ponerle
COUNT_BIG(*) ? Lo puse porque lo dice en los bol's pero no dice o no vi
clara la razon. A que se debe ? Cada vista indexada necesita eso ?

2) Segun vi en la ayuda, con solo crear el indice hace que la vista
"resida"
fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que hago
referencia a esta vista, no se expande en ese momento ? o sea que es como
si
fuera un trigger ?

3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
rendimiento ? seria o no preferible tener columnas que guarden año y mes
directamente en la tabla MOVIMIENTO ?

4) En sentido general esta vista habra de funcionar eficientemente bien ?
Hay alguna otra manera de definirla que sea mas eficiente ?

Mil gracias.

Danilsa Jimenez
Panama


Respuesta Responder a este mensaje
#3 Ricardo Passians
16/03/2005 - 14:22 | Informe spam
No. Las vistas indizadas son diferentes en comportamiento a las vistas
normales. Se comportan como si fuesen tablas.
Puedes ver mas informacion en los BOL.



"José Antonio" wrote in message
news:
Y que pasa cuando en tu tabla movimientos tengas 500.000 o 1 millon de
filas?

La vista se actualiza por cada fila insertada, anulada o modificada y
recalcula cada vez que se hace todas las filas de movimientos?

Si esto es asi el rendimiento del servidor creo que seria bastante malo.

Estoy equivocado?

Saludos.
"Danilsa" escribió en el mensaje
news:
> He creado una vista indexada (mi primera :)) leyendo los datos de los
> BOL
> y consultas del foro:
>
> Tengo una tabla MOVIMIENTO (cuenta char(15),fecha smalldatetime ,debito
> numeric(16,2),credito numeric(16,2)) /*una tabla de movimientos


contables
> por cuenta,fecha y su debito o credito*/
>
> La razon de la vista es tener un resumen por mes y por cuenta del total


de
> debitos y total de creditos de cada cuenta. Se debe a que constantemente
> piden reportes mensuales, bimestrales, trimestrales, estadisticas
> mensuales,
> promedios etc. de estos balances.
>
> Esta es la vista. Lo de schemabinding y demas cosas lo descubri despues
> de
> decenas de intentos y lecturas:
>
> *es una salida a un script*
>
> CREATE VIEW dbo.vBALANCE
> WITH SCHEMABINDING
> AS
> SELECT DATEPART([YEAR], fecha) AS ano, DATEPART([MONTH], fecha) AS
> mes,
> cuenta,
> SUM(debito) AS debitos, SUM(credito) AS creditos, COUNT_BIG (*) AS CNT
> FROM dbo.MOVIMIENTO
> GROUP BY DATEPART([YEAR], fecha), DATEPART([MONTH], fecha), cuenta
>
>
> Luego el indice agrupado:
>
> CREATE UNIQUE CLUSTERED INDEX [AnoMesCuenta] ON


[dbo].[vBALANCE]([ano],
> [mes], [cuenta]) ON [PRIMARY]
>
> Mis preguntas son:
> 1) Por que para que me permitiera crear el indice agrupado tuve que
> ponerle
> COUNT_BIG(*) ? Lo puse porque lo dice en los bol's pero no dice o no vi
> clara la razon. A que se debe ? Cada vista indexada necesita eso ?
>
> 2) Segun vi en la ayuda, con solo crear el indice hace que la vista
> "resida"
> fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que


hago
> referencia a esta vista, no se expande en ese momento ? o sea que es


como
> si
> fuera un trigger ?
>
> 3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
> rendimiento ? seria o no preferible tener columnas que guarden año y mes
> directamente en la tabla MOVIMIENTO ?
>
> 4) En sentido general esta vista habra de funcionar eficientemente bien


?
> Hay alguna otra manera de definirla que sea mas eficiente ?
>
> Mil gracias.
>
> Danilsa Jimenez
> Panama
>
>


Respuesta Responder a este mensaje
#4 Alonso
16/03/2005 - 17:47 | Informe spam
Mira yo hice una vista indexada para algo parecido: las ventas acumuladas
por producto y esta manejando millones de registros la tabla en la cual se
basa con muchas operaciones diarias y la verdad la verdad que el tiempo de
recuperar los datos desde la vista ni se nota.
Como te explican arriba, la vista es equivalente a hacer un trigger de
actualizacion para mantener actualizada otra tabla.


"José Antonio" wrote in message
news:
Y que pasa cuando en tu tabla movimientos tengas 500.000 o 1 millon de
filas?

La vista se actualiza por cada fila insertada, anulada o modificada y
recalcula cada vez que se hace todas las filas de movimientos?

Si esto es asi el rendimiento del servidor creo que seria bastante malo.

Estoy equivocado?

Saludos.
"Danilsa" escribió en el mensaje
news:
> He creado una vista indexada (mi primera :)) leyendo los datos de los
> BOL
> y consultas del foro:
>
> Tengo una tabla MOVIMIENTO (cuenta char(15),fecha smalldatetime ,debito
> numeric(16,2),credito numeric(16,2)) /*una tabla de movimientos


contables
> por cuenta,fecha y su debito o credito*/
>
> La razon de la vista es tener un resumen por mes y por cuenta del total


de
> debitos y total de creditos de cada cuenta. Se debe a que constantemente
> piden reportes mensuales, bimestrales, trimestrales, estadisticas
> mensuales,
> promedios etc. de estos balances.
>
> Esta es la vista. Lo de schemabinding y demas cosas lo descubri despues
> de
> decenas de intentos y lecturas:
>
> *es una salida a un script*
>
> CREATE VIEW dbo.vBALANCE
> WITH SCHEMABINDING
> AS
> SELECT DATEPART([YEAR], fecha) AS ano, DATEPART([MONTH], fecha) AS
> mes,
> cuenta,
> SUM(debito) AS debitos, SUM(credito) AS creditos, COUNT_BIG (*) AS CNT
> FROM dbo.MOVIMIENTO
> GROUP BY DATEPART([YEAR], fecha), DATEPART([MONTH], fecha), cuenta
>
>
> Luego el indice agrupado:
>
> CREATE UNIQUE CLUSTERED INDEX [AnoMesCuenta] ON


[dbo].[vBALANCE]([ano],
> [mes], [cuenta]) ON [PRIMARY]
>
> Mis preguntas son:
> 1) Por que para que me permitiera crear el indice agrupado tuve que
> ponerle
> COUNT_BIG(*) ? Lo puse porque lo dice en los bol's pero no dice o no vi
> clara la razon. A que se debe ? Cada vista indexada necesita eso ?
>
> 2) Segun vi en la ayuda, con solo crear el indice hace que la vista
> "resida"
> fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que


hago
> referencia a esta vista, no se expande en ese momento ? o sea que es


como
> si
> fuera un trigger ?
>
> 3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
> rendimiento ? seria o no preferible tener columnas que guarden año y mes
> directamente en la tabla MOVIMIENTO ?
>
> 4) En sentido general esta vista habra de funcionar eficientemente bien


?
> Hay alguna otra manera de definirla que sea mas eficiente ?
>
> Mil gracias.
>
> Danilsa Jimenez
> Panama
>
>


Respuesta Responder a este mensaje
#5 José Antonio
17/03/2005 - 13:01 | Informe spam
¿No se pueden crear vistas indizadas con el Manager de Sql?

"Danilsa" escribió en el mensaje
news:
He creado una vista indexada (mi primera :)) leyendo los datos de los
BOL
y consultas del foro:

Tengo una tabla MOVIMIENTO (cuenta char(15),fecha smalldatetime ,debito
numeric(16,2),credito numeric(16,2)) /*una tabla de movimientos contables
por cuenta,fecha y su debito o credito*/

La razon de la vista es tener un resumen por mes y por cuenta del total de
debitos y total de creditos de cada cuenta. Se debe a que constantemente
piden reportes mensuales, bimestrales, trimestrales, estadisticas
mensuales,
promedios etc. de estos balances.

Esta es la vista. Lo de schemabinding y demas cosas lo descubri despues
de
decenas de intentos y lecturas:

*es una salida a un script*

CREATE VIEW dbo.vBALANCE
WITH SCHEMABINDING
AS
SELECT DATEPART([YEAR], fecha) AS ano, DATEPART([MONTH], fecha) AS
mes,
cuenta,
SUM(debito) AS debitos, SUM(credito) AS creditos, COUNT_BIG (*) AS CNT
FROM dbo.MOVIMIENTO
GROUP BY DATEPART([YEAR], fecha), DATEPART([MONTH], fecha), cuenta


Luego el indice agrupado:

CREATE UNIQUE CLUSTERED INDEX [AnoMesCuenta] ON [dbo].[vBALANCE]([ano],
[mes], [cuenta]) ON [PRIMARY]

Mis preguntas son:
1) Por que para que me permitiera crear el indice agrupado tuve que
ponerle
COUNT_BIG(*) ? Lo puse porque lo dice en los bol's pero no dice o no vi
clara la razon. A que se debe ? Cada vista indexada necesita eso ?

2) Segun vi en la ayuda, con solo crear el indice hace que la vista
"resida"
fisicamente en la BD como una tabla ? es asi ? O sea que cada vez que hago
referencia a esta vista, no se expande en ese momento ? o sea que es como
si
fuera un trigger ?

3) Que opinion tienen sobre el uso de DATEPART aqui ? no afecta el
rendimiento ? seria o no preferible tener columnas que guarden año y mes
directamente en la tabla MOVIMIENTO ?

4) En sentido general esta vista habra de funcionar eficientemente bien ?
Hay alguna otra manera de definirla que sea mas eficiente ?

Mil gracias.

Danilsa Jimenez
Panama


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida