Columna Calculada con indice

03/08/2006 - 18:26 por GenioMaestro | Informe spam
Hola:

He creado una columna calculada en base a una funcion de usuario que
funciona bien, pero es muy lenta.

Cuando intento crear un indice sobre esa columna sql 2005 me dice:

Mens. 2709, Nivel 16, Estado 1, Línea 1
La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice o en
estadísticas, o como una clave de partición, porque tiene acceso a datos del
usuario o sistema.

Alguien puede decirme a que es debido y como solucionarlo???

Gracias

Preguntas similare

Leer las respuestas

#1 GenioMaestro
03/08/2006 - 19:01 | Informe spam
Y cuando intento decirle que la columna es persistente me dice esto otro:

Mens. 4934, Nivel 16, Estado 3, Línea 1
La columna calculada 'F_CAL_INI' de la tabla 'VALORES' no puede ser
persistente porque la columna tiene acceso a datos del usuario o sistema.

Alguna idea o solucion???

Gracias???



"GenioMaestro" escribió en el mensaje
news:OhN$
Hola:

He creado una columna calculada en base a una funcion de usuario que
funciona bien, pero es muy lenta.

Cuando intento crear un indice sobre esa columna sql 2005 me dice:

Mens. 2709, Nivel 16, Estado 1, Línea 1
La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice o
en estadísticas, o como una clave de partición, porque tiene acceso a
datos del usuario o sistema.

Alguien puede decirme a que es debido y como solucionarlo???

Gracias

Respuesta Responder a este mensaje
#2 Alejandro Mesa
03/08/2006 - 19:07 | Informe spam
GenioMaestro,

Pudieras mostrarnos la funcion?


AMB

"GenioMaestro" wrote:

Hola:

He creado una columna calculada en base a una funcion de usuario que
funciona bien, pero es muy lenta.

Cuando intento crear un indice sobre esa columna sql 2005 me dice:

Mens. 2709, Nivel 16, Estado 1, Línea 1
La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice o en
estadísticas, o como una clave de partición, porque tiene acceso a datos del
usuario o sistema.

Alguien puede decirme a que es debido y como solucionarlo???

Gracias



Respuesta Responder a este mensaje
#3 GenioMaestro
03/08/2006 - 19:20 | Informe spam
Va la funcion:

ALTER FUNCTION [dbo].[FECHA_CAL_INI] (@entra_valor as INT)
RETURNS DATETIME
WITH SCHEMABINDING
BEGIN

RETURN (
SELECT TOP 1 COTIZACIONES.FECHA
FROM DBO.COTIZACIONES LEFT JOIN DBO.CALCULOS
ON COTIZACIONES.COD_VALOR = CALCULOS.COD_VALOR AND COTIZACIONES.FECHA =
CALCULOS.FECHA_CAL
WHERE COTIZACIONES.COD_VALOR = @entra_valor AND .CALCULOS.FECHA_CAL IS NULL
ORDER BY COTIZACIONES.FECHA ASC
)
END

Gracias por el interes, Alejandro.



"Alejandro Mesa" escribió en el
mensaje news:
GenioMaestro,

Pudieras mostrarnos la funcion?


AMB

"GenioMaestro" wrote:

Hola:

He creado una columna calculada en base a una funcion de usuario que
funciona bien, pero es muy lenta.

Cuando intento crear un indice sobre esa columna sql 2005 me dice:

Mens. 2709, Nivel 16, Estado 1, Línea 1
La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice o
en
estadísticas, o como una clave de partición, porque tiene acceso a datos
del
usuario o sistema.

Alguien puede decirme a que es debido y como solucionarlo???

Gracias



Respuesta Responder a este mensaje
#4 GenioMaestro
03/08/2006 - 19:32 | Informe spam
Y además, esta consulta tampoco me la paraleliza, tarda dos o tres minutos
en darme la select con la columna calculada, porque la está calculando al
vuelo, cada vez que la pido, y con el micro al 50%, claro.

Hay alguna manera de forzar al sql server 2005 para que paralelize una
consulta????



"GenioMaestro" escribió en el mensaje
news:
Va la funcion:

ALTER FUNCTION [dbo].[FECHA_CAL_INI] (@entra_valor as INT)
RETURNS DATETIME
WITH SCHEMABINDING
BEGIN

RETURN (
SELECT TOP 1 COTIZACIONES.FECHA
FROM DBO.COTIZACIONES LEFT JOIN DBO.CALCULOS
ON COTIZACIONES.COD_VALOR = CALCULOS.COD_VALOR AND COTIZACIONES.FECHA =
CALCULOS.FECHA_CAL
WHERE COTIZACIONES.COD_VALOR = @entra_valor AND .CALCULOS.FECHA_CAL IS
NULL
ORDER BY COTIZACIONES.FECHA ASC
)
END

Gracias por el interes, Alejandro.



"Alejandro Mesa" escribió en el
mensaje news:
GenioMaestro,

Pudieras mostrarnos la funcion?


AMB

"GenioMaestro" wrote:

Hola:

He creado una columna calculada en base a una funcion de usuario que
funciona bien, pero es muy lenta.

Cuando intento crear un indice sobre esa columna sql 2005 me dice:

Mens. 2709, Nivel 16, Estado 1, Línea 1
La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice
o en
estadísticas, o como una clave de partición, porque tiene acceso a datos
del
usuario o sistema.

Alguien puede decirme a que es debido y como solucionarlo???

Gracias









Respuesta Responder a este mensaje
#5 Alejandro Mesa
03/08/2006 - 20:54 | Informe spam
GenioMaestro,

Chequea el tema "Creating Indexes on Computed Columns" en los BOL. Puede ser
que como calculas el valor a partir de multiples filas, esto hace que la
funcion sea no determinista. Usa la funcion "objectproperty" para comprobar
si la funcion es determinista y en caso de ser determinista verifica si es
imprescisa, creo que en ese caso puedes usar la opcion "persisted" cuando
creas la columna y sql server dejara crear un indice.

Creating Indexes on Computed Columns
http://msdn2.microsoft.com/en-us/li...89292.aspx

> SELECT TOP 1 COTIZACIONES.FECHA
> FROM DBO.COTIZACIONES LEFT JOIN DBO.CALCULOS
> ON COTIZACIONES.COD_VALOR = CALCULOS.COD_VALOR AND COTIZACIONES.FECHA =
> CALCULOS.FECHA_CAL
> WHERE COTIZACIONES.COD_VALOR = @entra_valor AND .CALCULOS.FECHA_CAL IS
> NULL
> ORDER BY COTIZACIONES.FECHA ASC



A proposito, yo no usaria "left join" para comprobar existencia. Usaria el
operador "exists" a cambio. De todas maneras prueba ambas versiones a ver
cual te da mejor resultado. Tambien ve si tener un indice en [COTIZACIONES]
por [COD_VALOR] ayuda a mejorar el plan de ejecucion.

SELECT TOP 1
c.FECHA
FROM
DBO.COTIZACIONES as a
WHERE
c.COD_VALOR = @entra_valor
and not exists (
select *
from DBO.CALCULOS as b
where
b.COD_VALOR = a.COD_VALOR
and b.FECHA_CAL = a.FECHA
)
ORDER BY
c.FECHA ASC
go


AMB

"GenioMaestro" wrote:

Y además, esta consulta tampoco me la paraleliza, tarda dos o tres minutos
en darme la select con la columna calculada, porque la está calculando al
vuelo, cada vez que la pido, y con el micro al 50%, claro.

Hay alguna manera de forzar al sql server 2005 para que paralelize una
consulta????



"GenioMaestro" escribió en el mensaje
news:
> Va la funcion:
>
> ALTER FUNCTION [dbo].[FECHA_CAL_INI] (@entra_valor as INT)
> RETURNS DATETIME
> WITH SCHEMABINDING
> BEGIN
>
> RETURN (
> SELECT TOP 1 COTIZACIONES.FECHA
> FROM DBO.COTIZACIONES LEFT JOIN DBO.CALCULOS
> ON COTIZACIONES.COD_VALOR = CALCULOS.COD_VALOR AND COTIZACIONES.FECHA =
> CALCULOS.FECHA_CAL
> WHERE COTIZACIONES.COD_VALOR = @entra_valor AND .CALCULOS.FECHA_CAL IS
> NULL
> ORDER BY COTIZACIONES.FECHA ASC
> )
> END
>
> Gracias por el interes, Alejandro.
>
>
>
> "Alejandro Mesa" escribió en el
> mensaje news:
>> GenioMaestro,
>>
>> Pudieras mostrarnos la funcion?
>>
>>
>> AMB
>>
>> "GenioMaestro" wrote:
>>
>>> Hola:
>>>
>>> He creado una columna calculada en base a una funcion de usuario que
>>> funciona bien, pero es muy lenta.
>>>
>>> Cuando intento crear un indice sobre esa columna sql 2005 me dice:
>>>
>>> Mens. 2709, Nivel 16, Estado 1, Línea 1
>>> La columna 'F_CAL_INI' de tabla 'VALORES' no se puede usar en un índice
>>> o en
>>> estadísticas, o como una clave de partición, porque tiene acceso a datos
>>> del
>>> usuario o sistema.
>>>
>>> Alguien puede decirme a que es debido y como solucionarlo???
>>>
>>> Gracias
>>>
>>>
>>>
>
>



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