vistas materializadas

09/05/2006 - 13:05 por e-lores | Informe spam
Tengo una vista que trabaja sobre muchos registros y además hace
agrupaciones, sumas, etcétera. Por eso me interesa optimizarla.

¿Cómo se crea una vista materializada en SQL Server 2000? ¿Dónde puede
encontrar informacíón?

Gracias.
Ernesto.

Preguntas similare

Leer las respuestas

#6 Miguel Egea
09/05/2006 - 22:25 | Informe spam
¿por que no puedes?, he intentado hacer algo así..y funciona bien..

use pruebas

go

create table test (id int identity(1,1) primary key, fecha smalldatetime
default cast(getdate() as smalldatetime), total money)

go

go

create view Test_vistaIndexada with schemabinding

as

Select year(fecha) anio ,month(fecha) mes,

sum(isnull(total,0)) Total ,count_big(*) Filas,

sum ( isnull(case datepart(hour,fecha) when 22 then -1 else Total end,0))
TotalEstaHora

from dbo.Test

group by year(fecha),month(fecha)

go

create unique clustered index ix_test_vistaIndexada on
test_VistaIndexada(anio,mes)


go

insert into test (fecha,total) select cast(orderdate as
smalldatetime),Subtotal from AdventureWorks.sales.SalesOrderHeader

go

select * from test_vistaindexada



"e-lores" escribió en el mensaje
news:
Tengo una tabla donde uno de los registros es la hora (de 1 a 24). He
hecho la siguiente vista 'horizontal' de los datos

SELECT identificador,
YEAR(fecha_MHE) AS AÑO , MONTH(fecha_MHE) AS MES , DAY(fecha_MHE) AS DIA,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 0 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H01,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 1 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H02,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 2 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H03,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 3 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H04,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 4 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H05,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 5 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H06,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 6 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H07,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 7 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H08,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 8 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H09,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 9 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H10,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 10 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H11,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 11 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H12,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 12 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H13,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 13 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H14,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 14 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H15,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 15 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H16,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 16 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H17,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 17 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H18,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 18 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H19,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 19 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H20,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 20 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H21,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 21 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H22,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 22 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H23,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 23 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H24
FROM MedidaHoraria
GROUP BY identificador, DAY(fecha_MHE), MONTH(fecha_MHE), YEAR(fecha_MHE)

La cantidad de registros es enorme y ha esta vista le cuesta un poquillo.
Pensando estratégias para optimizar se me ocurrió lo de las vistas
indexadas pero para esta en concreto no se puede crear un índice. Además
no creo que sea tampoco muy óptimo porque se añaden registros
constantemente.

Seguramente optaré por utilizar triggers que me gestionen los datos por
duplicado en otra tabla ya con este formato.

¿Se os ocurre otra forma de optimización?
Gracias.


"Miguel Egea" ha escrit en el missatge dels
grups de discussió:%
Cuentanos cual es el objetivo :)


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma completa
de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Vistas indexadas era lo que andaba buscando, aunque he descubierto que
no me sirven. Intentaré buscar otra solución.

Gracias.

"Miguel Egea" ha escrit en el missatge
dels grups de discussió:
Busca vista indexadas en los libros en pantalla, creo que es justo lo
que estás buscando.

Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma
completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Tengo una vista que trabaja sobre muchos registros y además hace
agrupaciones, sumas, etcétera. Por eso me interesa optimizarla.

¿Cómo se crea una vista materializada en SQL Server 2000? ¿Dónde puede
encontrar informacíón?

Gracias.
Ernesto.

















Respuesta Responder a este mensaje
#7 e-lores
10/05/2006 - 09:18 | Informe spam
No puedo por varios motivos.

He leído que no puedes poner índices en vistas donde has usado por ejemplo
el COUNT() (y de hecho me daba error al crear el índice)

Además aunque pudiera no se si es una buena solución porque en la tabla
original se insertan datos continuamente y el tema de indexar vistas se
recomienda más para DataMarts, etc.


"Miguel Egea" ha escrit en el missatge dels
grups de discussió:
¿por que no puedes?, he intentado hacer algo así..y funciona bien..

use pruebas

go

create table test (id int identity(1,1) primary key, fecha smalldatetime
default cast(getdate() as smalldatetime), total money)

go

go

create view Test_vistaIndexada with schemabinding

as

Select year(fecha) anio ,month(fecha) mes,

sum(isnull(total,0)) Total ,count_big(*) Filas,

sum ( isnull(case datepart(hour,fecha) when 22 then -1 else Total end,0))
TotalEstaHora

from dbo.Test

group by year(fecha),month(fecha)

go

create unique clustered index ix_test_vistaIndexada on
test_VistaIndexada(anio,mes)


go

insert into test (fecha,total) select cast(orderdate as
smalldatetime),Subtotal from AdventureWorks.sales.SalesOrderHeader

go

select * from test_vistaindexada



"e-lores" escribió en el mensaje
news:
Tengo una tabla donde uno de los registros es la hora (de 1 a 24). He
hecho la siguiente vista 'horizontal' de los datos

SELECT identificador,
YEAR(fecha_MHE) AS AÑO , MONTH(fecha_MHE) AS MES , DAY(fecha_MHE) AS DIA,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 0 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H01,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 1 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H02,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 2 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H03,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 3 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H04,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 4 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H05,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 5 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H06,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 6 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H07,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 7 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H08,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 8 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H09,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 9 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H10,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 10 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H11,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 11 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H12,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 12 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H13,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 13 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H14,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 14 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H15,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 15 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H16,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 16 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H17,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 17 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H18,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 18 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H19,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 19 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H20,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 20 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H21,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 21 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H22,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 22 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H23,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 23 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H24
FROM MedidaHoraria
GROUP BY identificador, DAY(fecha_MHE), MONTH(fecha_MHE), YEAR(fecha_MHE)

La cantidad de registros es enorme y ha esta vista le cuesta un poquillo.
Pensando estratégias para optimizar se me ocurrió lo de las vistas
indexadas pero para esta en concreto no se puede crear un índice. Además
no creo que sea tampoco muy óptimo porque se añaden registros
constantemente.

Seguramente optaré por utilizar triggers que me gestionen los datos por
duplicado en otra tabla ya con este formato.

¿Se os ocurre otra forma de optimización?
Gracias.


"Miguel Egea" ha escrit en el missatge dels
grups de discussió:%
Cuentanos cual es el objetivo :)


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma completa
de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Vistas indexadas era lo que andaba buscando, aunque he descubierto que
no me sirven. Intentaré buscar otra solución.

Gracias.

"Miguel Egea" ha escrit en el missatge
dels grups de discussió:
Busca vista indexadas en los libros en pantalla, creo que es justo lo
que estás buscando.

Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma
completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Tengo una vista que trabaja sobre muchos registros y además hace
agrupaciones, sumas, etcétera. Por eso me interesa optimizarla.

¿Cómo se crea una vista materializada en SQL Server 2000? ¿Dónde
puede encontrar informacíón?

Gracias.
Ernesto.





















Respuesta Responder a este mensaje
#8 Miguel Egea
10/05/2006 - 10:07 | Informe spam
Lo primero que has leido no está bien, si que se pueden, lo segundo, lo de
que penaliza las inserciones es así, pero si solo usas una tabla y no joins
muy complejos, no le veo mayor problema, revisa la sintaxis que te he pasado
y prueba, seguramente te sorprenda.


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar para
obtener soluciones y educación avanzada para la plataforma completa de
sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:O$
No puedo por varios motivos.

He leído que no puedes poner índices en vistas donde has usado por ejemplo
el COUNT() (y de hecho me daba error al crear el índice)

Además aunque pudiera no se si es una buena solución porque en la tabla
original se insertan datos continuamente y el tema de indexar vistas se
recomienda más para DataMarts, etc.


"Miguel Egea" ha escrit en el missatge dels
grups de discussió:
¿por que no puedes?, he intentado hacer algo así..y funciona bien..

use pruebas

go

create table test (id int identity(1,1) primary key, fecha smalldatetime
default cast(getdate() as smalldatetime), total money)

go

go

create view Test_vistaIndexada with schemabinding

as

Select year(fecha) anio ,month(fecha) mes,

sum(isnull(total,0)) Total ,count_big(*) Filas,

sum ( isnull(case datepart(hour,fecha) when 22 then -1 else Total end,0))
TotalEstaHora

from dbo.Test

group by year(fecha),month(fecha)

go

create unique clustered index ix_test_vistaIndexada on
test_VistaIndexada(anio,mes)


go

insert into test (fecha,total) select cast(orderdate as
smalldatetime),Subtotal from AdventureWorks.sales.SalesOrderHeader

go

select * from test_vistaindexada



"e-lores" escribió en el mensaje
news:
Tengo una tabla donde uno de los registros es la hora (de 1 a 24). He
hecho la siguiente vista 'horizontal' de los datos

SELECT identificador,
YEAR(fecha_MHE) AS AÑO , MONTH(fecha_MHE) AS MES , DAY(fecha_MHE) AS
DIA,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 0 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H01,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 1 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H02,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 2 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H03,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 3 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H04,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 4 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H05,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 5 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H06,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 6 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H07,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 7 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H08,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 8 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H09,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 9 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H10,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 10 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H11,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 11 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H12,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 12 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H13,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 13 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H14,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 14 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H15,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 15 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H16,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 16 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H17,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 17 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H18,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 18 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H19,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 19 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H20,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 20 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H21,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 21 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H22,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 22 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H23,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 23 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H24
FROM MedidaHoraria
GROUP BY identificador, DAY(fecha_MHE), MONTH(fecha_MHE),
YEAR(fecha_MHE)

La cantidad de registros es enorme y ha esta vista le cuesta un
poquillo. Pensando estratégias para optimizar se me ocurrió lo de las
vistas indexadas pero para esta en concreto no se puede crear un índice.
Además no creo que sea tampoco muy óptimo porque se añaden registros
constantemente.

Seguramente optaré por utilizar triggers que me gestionen los datos por
duplicado en otra tabla ya con este formato.

¿Se os ocurre otra forma de optimización?
Gracias.


"Miguel Egea" ha escrit en el missatge
dels grups de discussió:%
Cuentanos cual es el objetivo :)


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma
completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Vistas indexadas era lo que andaba buscando, aunque he descubierto que
no me sirven. Intentaré buscar otra solución.

Gracias.

"Miguel Egea" ha escrit en el missatge
dels grups de discussió:
Busca vista indexadas en los libros en pantalla, creo que es justo lo
que estás buscando.

Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede
confiar para obtener soluciones y educación avanzada para la
plataforma completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Tengo una vista que trabaja sobre muchos registros y además hace
agrupaciones, sumas, etcétera. Por eso me interesa optimizarla.

¿Cómo se crea una vista materializada en SQL Server 2000? ¿Dónde
puede encontrar informacíón?

Gracias.
Ernesto.

























Respuesta Responder a este mensaje
#9 e-lores
10/05/2006 - 11:21 | Informe spam
Gracias, Me lo miraré

"Miguel Egea" ha escrit en el missatge dels
grups de discussió:%
Lo primero que has leido no está bien, si que se pueden, lo segundo, lo de
que penaliza las inserciones es así, pero si solo usas una tabla y no
joins muy complejos, no le veo mayor problema, revisa la sintaxis que te
he pasado y prueba, seguramente te sorprenda.


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma completa
de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:O$
No puedo por varios motivos.

He leído que no puedes poner índices en vistas donde has usado por
ejemplo el COUNT() (y de hecho me daba error al crear el índice)

Además aunque pudiera no se si es una buena solución porque en la tabla
original se insertan datos continuamente y el tema de indexar vistas se
recomienda más para DataMarts, etc.


"Miguel Egea" ha escrit en el missatge dels
grups de discussió:
¿por que no puedes?, he intentado hacer algo así..y funciona bien..

use pruebas

go

create table test (id int identity(1,1) primary key, fecha smalldatetime
default cast(getdate() as smalldatetime), total money)

go

go

create view Test_vistaIndexada with schemabinding

as

Select year(fecha) anio ,month(fecha) mes,

sum(isnull(total,0)) Total ,count_big(*) Filas,

sum ( isnull(case datepart(hour,fecha) when 22 then -1 else Total
end,0)) TotalEstaHora

from dbo.Test

group by year(fecha),month(fecha)

go

create unique clustered index ix_test_vistaIndexada on
test_VistaIndexada(anio,mes)


go

insert into test (fecha,total) select cast(orderdate as
smalldatetime),Subtotal from AdventureWorks.sales.SalesOrderHeader

go

select * from test_vistaindexada



"e-lores" escribió en el mensaje
news:
Tengo una tabla donde uno de los registros es la hora (de 1 a 24). He
hecho la siguiente vista 'horizontal' de los datos

SELECT identificador,
YEAR(fecha_MHE) AS AÑO , MONTH(fecha_MHE) AS MES , DAY(fecha_MHE) AS
DIA,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 0 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H01,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 1 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H02,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 2 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H03,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 3 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H04,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 4 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H05,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 5 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H06,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 6 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H07,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 7 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H08,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 8 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H09,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 9 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H10,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 10 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H11,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 11 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H12,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 12 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H13,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 13 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H14,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 14 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H15,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 15 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H16,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 16 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H17,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 17 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H18,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 18 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H19,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 19 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H20,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 20 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H21,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 21 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H22,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 22 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H23,
SUM(CASE WHEN DATEPART(hour, fecha_MHE) = 23 THEN activaSaliente_MHE
ELSE -1 END) + COUNT(*) - 1 AS H24
FROM MedidaHoraria
GROUP BY identificador, DAY(fecha_MHE), MONTH(fecha_MHE),
YEAR(fecha_MHE)

La cantidad de registros es enorme y ha esta vista le cuesta un
poquillo. Pensando estratégias para optimizar se me ocurrió lo de las
vistas indexadas pero para esta en concreto no se puede crear un
índice. Además no creo que sea tampoco muy óptimo porque se añaden
registros constantemente.

Seguramente optaré por utilizar triggers que me gestionen los datos por
duplicado en otra tabla ya con este formato.

¿Se os ocurre otra forma de optimización?
Gracias.


"Miguel Egea" ha escrit en el missatge
dels grups de discussió:%
Cuentanos cual es el objetivo :)


Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede confiar
para obtener soluciones y educación avanzada para la plataforma
completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Vistas indexadas era lo que andaba buscando, aunque he descubierto
que no me sirven. Intentaré buscar otra solución.

Gracias.

"Miguel Egea" ha escrit en el missatge
dels grups de discussió:
Busca vista indexadas en los libros en pantalla, creo que es justo
lo que estás buscando.

Miguel Egea Gómez

SQLServer MVP

Director de Servicios Corporativos

Solid Quality Learning Iberoamericana



"Solid Quality Learning es el proveedor global en el que puede
confiar para obtener soluciones y educación avanzada para la
plataforma completa de sistemas de bases de datos de Microsoft."

www.SolidQualityLearning.com

"e-lores" escribió en el mensaje
news:
Tengo una vista que trabaja sobre muchos registros y además hace
agrupaciones, sumas, etcétera. Por eso me interesa optimizarla.

¿Cómo se crea una vista materializada en SQL Server 2000? ¿Dónde
puede encontrar informacíón?

Gracias.
Ernesto.





























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