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