No se puede crear el índice porque la columna de clave 'DiaLlamada' no es determin ista o es imprecisa.

02/02/2009 - 22:08 por Mauro Pasetti | Informe spam
Necesito optimizar la performance para devolver registros de una tabla
para una fecha determinada (sin importar el horario).
Utilizo SQL Server 2000 EE

Utilicé DateAdd(day,0,FecHoraLogin)
Utilicé DateAdd(day,cast(0 as datetime),FecHoraLogin)
y finalemente...

[DiaLlamada] AS (convert(int,[FecHoraLogin]))

Por que quiero crear el siguiente índice:
CREATE NONCLUSTERED INDEX [Key_DiaLlamada] ON
[dbo].[MECResumenDiarioTiempos]
(
DiaLlamada,
IdAgente
) ON [SECONDARY]
GO
pero siempre tengo el mismo error.
No se puede crear el índice porque la columna de clave 'DiaLlamada' no
es determinista o es imprecisa.

Agradecería cualquier consejo y/o ayuda porque por toda la info que
busqué, no encontré nada que me pueda ayudar. Tampo conozco si existe
otra forma mejor para obtener la performance que busco.

Preguntas similare

Leer las respuestas

#1 Mauro Pasetti
02/02/2009 - 22:46 | Informe spam
ya lo solucioné, agradecería si otro tiene una propuesta mejor:

(datepart(year,[FecHoraLogin]) * 10000 + datepart(month,[FecHoraLogin])
* 100 + datepart(day,[FecHoraLogin]))

Es determinista y funciona con el índice.

Salu2, y gracias a todos. Si conocen una fórmula mejor, por favor no
duden en enviarla.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
02/02/2009 - 23:40 | Informe spam
Mauro,

Trata:

[DiaLLamada] as convert(char(8), FecHoraLogin, 112)



AMB



"Mauro Pasetti" wrote:

ya lo solucioné, agradecería si otro tiene una propuesta mejor:

(datepart(year,[FecHoraLogin]) * 10000 + datepart(month,[FecHoraLogin])
* 100 + datepart(day,[FecHoraLogin]))

Es determinista y funciona con el índice.

Salu2, y gracias a todos. Si conocen una fórmula mejor, por favor no
duden en enviarla.

Respuesta Responder a este mensaje
#3 Mauro Pasetti
03/02/2009 - 00:55 | Informe spam
Excelente Alejandro, gracias. Es un código más simple, ahora me
pregunto si para el índice que tengo que hacer
CREATE NONCLUSTERED INDEX [Key_DiaLlamada] ON
[dbo].[MECResumenDiarioTiempos]
(
DiaLlamada,
IdAgente
) ON [SECONDARY]
GO

Siendo IdAgente un entero, me pregunto si no me conviene hacer:
[DiaLLamada] as (convert(int,convert(char(8),[FecHoraLogin],112)))

Para trabajar un un índice numérico. La verdad es que no conozco mucho
a cerca de la forma en que trabajan los índices de SQL Server y cual
sería la opción más conveniente, si lo sabés y me desburrás, te lo
agradecería.

Salu2, Mauro.

Alejandro Mesa escribió:
Mauro,

Trata:

[DiaLLamada] as convert(char(8), FecHoraLogin, 112)



AMB



"Mauro Pasetti" wrote:

ya lo solucioné, agradecería si otro tiene una propuesta mejor:

(datepart(year,[FecHoraLogin]) * 10000 + datepart(month,[FecHoraLogin])
* 100 + datepart(day,[FecHoraLogin]))

Es determinista y funciona con el índice.

Salu2, y gracias a todos. Si conocen una fórmula mejor, por favor no
duden en enviarla.

Respuesta Responder a este mensaje
#4 Jose Mariano Alvarez
03/02/2009 - 01:19 | Informe spam
1 Cea un indice sobre la columna fecha (con hora)
2 Corrige la consulta para que el where diga

WHERE fecha >= @dia
and fecha < dateadd(dd,1,@dia)



Saludos


Ing. Jose Mariano Alvarez
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.










"Mauro Pasetti" wrote in message
news:
Excelente Alejandro, gracias. Es un código más simple, ahora me pregunto
si para el índice que tengo que hacer
CREATE NONCLUSTERED INDEX [Key_DiaLlamada] ON
[dbo].[MECResumenDiarioTiempos]
(
DiaLlamada,
IdAgente
) ON [SECONDARY]
GO

Siendo IdAgente un entero, me pregunto si no me conviene hacer:
[DiaLLamada] as (convert(int,convert(char(8),[FecHoraLogin],112)))

Para trabajar un un índice numérico. La verdad es que no conozco mucho a
cerca de la forma en que trabajan los índices de SQL Server y cual sería
la opción más conveniente, si lo sabés y me desburrás, te lo agradecería.

Salu2, Mauro.

Alejandro Mesa escribió:
Mauro,

Trata:

[DiaLLamada] as convert(char(8), FecHoraLogin, 112)

AMB



"Mauro Pasetti" wrote:

ya lo solucioné, agradecería si otro tiene una propuesta mejor:

(datepart(year,[FecHoraLogin]) * 10000 + datepart(month,[FecHoraLogin])
* 100 + datepart(day,[FecHoraLogin]))

Es determinista y funciona con el índice.

Salu2, y gracias a todos. Si conocen una fórmula mejor, por favor no
duden en enviarla.

Respuesta Responder a este mensaje
#5 Mauro Pasetti
03/02/2009 - 02:24 | Informe spam
Estimado José, actualmente yo utilizo DateDiff que es mucho más simple
para buscar datos de una fecha sobre un campo FechaHora y es específico
para esta tarea (y existe un índice para tal caso), pero cuando hablamos
de 4.000.000 de registros y 10.000 registros por día, pienso que me
optimiza mucho más un índice por un campo con un valor único por día.

Salu2, Mauro

Jose Mariano Alvarez escribió:
1 Cea un indice sobre la columna fecha (con hora)
2 Corrige la consulta para que el where diga

WHERE fecha >= @dia
and fecha < dateadd(dd,1,@dia)


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