Index on view (2a parte)

01/06/2004 - 16:31 por Isaías | Informe spam
Pues ahi tienen que le di drop a mi tabla (respaldando la
informacion de la misma), la volvi a crear, no sin antes
colocar en ON el ANSI_NULLS.

Al momento de crear la vista con la opcion: WITH
SCHEMABINDING

Todo bien, pero al momento de crear el indice:

CREATE UNIQUE CLUSTERED INDEX key_view_1403 ON
view_1403_MI_other (HORA, MINUTO)

Me envia este error:

Server: Msg 1936, Level 16, State 1, Line 1
Cannot index the view 'view_1403_MI_other' It contains one
or more disallowed constructs.

Este es el script de mi vista:

CREATE view view_1403_MI_other
WITH SCHEMABINDING
AS
SELECT DATEPART(hh,fd_FileInputDateTime) AS HORA,
DATEPART(mi,fd_FileInputDateTime) AS MINUTO,
COUNT(fb_InputFileStatus) as TOTAL
FROM dbo.file_1403
WHERE fd_FileInputDateTime BETWEEN CONVERT(CHAR
(10),GETDATE(),120)+' 00:00:00' AND DATEADD(MI,-3,GETDATE
())
AND fb_InputFileStatus = 1
GROUP BY datepart(hh,fd_FileInputDateTime), datepart
(mi,fd_FileInputDateTime)

Estoy metido en un lio.

Cualquier comentario, gracias.

Preguntas similare

Leer las respuestas

#1 Jose Mariano Alvarez \(MUG\)
01/06/2004 - 18:20 | Informe spam
No puedes usar Count(*), debes usar Count_Big(*)

Tampoco puedes usar GetDate() porque es no determinista.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Isaías" wrote in message
news:1662201c447e5$24258ca0$

Pues ahi tienen que le di drop a mi tabla (respaldando la
informacion de la misma), la volvi a crear, no sin antes
colocar en ON el ANSI_NULLS.

Al momento de crear la vista con la opcion: WITH
SCHEMABINDING

Todo bien, pero al momento de crear el indice:

CREATE UNIQUE CLUSTERED INDEX key_view_1403 ON
view_1403_MI_other (HORA, MINUTO)

Me envia este error:

Server: Msg 1936, Level 16, State 1, Line 1
Cannot index the view 'view_1403_MI_other' It contains one
or more disallowed constructs.

Este es el script de mi vista:

CREATE view view_1403_MI_other
WITH SCHEMABINDING
AS
SELECT DATEPART(hh,fd_FileInputDateTime) AS HORA,
DATEPART(mi,fd_FileInputDateTime) AS MINUTO,
COUNT(fb_InputFileStatus) as TOTAL
FROM dbo.file_1403
WHERE fd_FileInputDateTime BETWEEN CONVERT(CHAR
(10),GETDATE(),120)+' 00:00:00' AND DATEADD(MI,-3,GETDATE
())
AND fb_InputFileStatus = 1
GROUP BY datepart(hh,fd_FileInputDateTime), datepart
(mi,fd_FileInputDateTime)

Estoy metido en un lio.

Cualquier comentario, gracias.








Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.693 / Virus Database: 454 - Release Date: 31/05/2004
Respuesta Responder a este mensaje
#2 Isaías
01/06/2004 - 18:43 | Informe spam
Gracias Jose

Probare lo del Count_Big(*), ahora bien, como resuelves la
problematica de contar solo en la vista, aquellos
registros que tengan UN MINUTO (en este caso son 3) de
ENVEJECIMIENTO en la base.

Un saludo.
Respuesta Responder a este mensaje
#3 Jose Mariano Alvarez \(MUG\)
01/06/2004 - 18:44 | Informe spam
No tienes forma en la vista indexada. Crea la vista indexada sin ello
Luego crea una segunda vista que tenga la condición que precisas. Esta
segunda sin índice por supuesto.
La otra es usar un Stored Procedure que te devuelva lo mismo que la segunda
vista-




Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Isaías" wrote in message
news:16a3701c447f7$a1582860$
Gracias Jose

Probare lo del Count_Big(*), ahora bien, como resuelves la
problematica de contar solo en la vista, aquellos
registros que tengan UN MINUTO (en este caso son 3) de
ENVEJECIMIENTO en la base.

Un saludo.





Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.693 / Virus Database: 454 - Release Date: 31/05/2004
Respuesta Responder a este mensaje
#4 Isaías
01/06/2004 - 19:10 | Informe spam
Gracias, lo he intentado con:
WHERE fd_FileInputDateTime <= (select max(dateadd(mi, -
2, fd_FileInputDateTime)) from dbo.file_1403)

Pero nada, me sigue enviando un error.

Este es el escenario:

Tengo 2 servidores, 1 "replica" al otro por cada registro
procesado, este registro, "podria" ser modificado en su
status en un lapso de 13 o 15 segundos, NO MAS, es por eso
que requiero tomar TODOS AQUELLOS REGISTROS cuyo
envejecimiento sea >= a 1 (2) minutos, ¿porque hacerlo
asi?, de lo contrario, puedo tener un DEAD LOCK (ya me ha
sucedido).

¿Porque crear una vista?.

Los registros, son llamadas telefonicas de alto trafico
(hasta 40,000 por media hora), entonces mi cliente,
requiere hacer un analisis concentrado por CADA MINUTO.

Esa es la razon para no estar "tirando" a cada rato el
SELECT que contruye a la vista.

Espero haberme explicado.

Gracias por tus comentarios.
Respuesta Responder a este mensaje
#5 Jose Mariano Alvarez \(MUG\)
01/06/2004 - 19:40 | Informe spam
Las vistas indexadas tampoco toleran los subqueries.
Te sugiero que revises la ayuda para ver todas las condiciones.

Mira, yo he trabajado en control de fraude telefónico y se de que se trata.
La idea que usas es distinta a la que yo usaba (no habia vistas indexadas)
pero para el caso no entiendo la necesidad de la vista indexada con 100.000
registros por hora , aunque puede ser útil. Si creas un índice por fecha la
respuesta a una consulta puede ser muy buena y no estarías penalizando las
actualizaciones a causa de la vista indexada.

En el caso de que desees hacer la vista indexada podrias definirla sin la
condición de fecha

Si tienes un solo día en el archivo puedes usar algo así para la vista

SELECT
DATEPART(hh,fd_FileInputDateTime) * 60 + DATEPART(mi,fd_FileInputDateTime)
AS MINUTO,
COUNT(fb_InputFileStatus) as TOTAL
FROM dbo.file_1403
WHERE
fb_InputFileStatus = 1
GROUP BY
DATEPART(hh,fd_FileInputDateTime) * 60 + DATEPART(mi,fd_FileInputDateTime)


Luego consultas la vista como

Select *
from Mivista
where MINUTO betwhee (@mindesde + @horadesde * 60) AND (@minhasta +
@horahasta * 60)


Si lo desea puedes agregar el día también a la vista y a la consulta


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Isaías" wrote in message
news:167dc01c447fb$523895e0$
Gracias, lo he intentado con:
WHERE fd_FileInputDateTime <= (select max(dateadd(mi, -
2, fd_FileInputDateTime)) from dbo.file_1403)

Pero nada, me sigue enviando un error.

Este es el escenario:

Tengo 2 servidores, 1 "replica" al otro por cada registro
procesado, este registro, "podria" ser modificado en su
status en un lapso de 13 o 15 segundos, NO MAS, es por eso
que requiero tomar TODOS AQUELLOS REGISTROS cuyo
envejecimiento sea >= a 1 (2) minutos, ¿porque hacerlo
asi?, de lo contrario, puedo tener un DEAD LOCK (ya me ha
sucedido).

¿Porque crear una vista?.

Los registros, son llamadas telefonicas de alto trafico
(hasta 40,000 por media hora), entonces mi cliente,
requiere hacer un analisis concentrado por CADA MINUTO.

Esa es la razon para no estar "tirando" a cada rato el
SELECT que contruye a la vista.

Espero haberme explicado.

Gracias por tus comentarios.



Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.693 / Virus Database: 454 - Release Date: 31/05/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida