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
 

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.

Preguntas similares