Índices en columnas calculadas
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Los índices se pueden definir en columnas calculadas si se cumplen estos requisitos:
- Requisitos de propiedad
- Requisitos de determinismo
- Requisitos de precisión
- Requisitos de tipo de datos
- Requisitos de la opción SET
Nota:
SET QUOTED_IDENTIFIER
debe ser ON
al crear o cambiar índices en columnas calculadas o vista indexadas. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).
Requisitos de propiedad
Todas las referencias a funciones de la columna calculada deben tener el mismo propietario que la tabla.
Requisitos de determinismo
Las expresiones son deterministas si siempre devuelven el mismo resultado para un conjunto de entradas específico. La propiedad IsDeterministic
de la función COLUMNPROPERTY informa de si una expresión computed_column_expression es determinista.
La expresión computed_column_expression debe ser determinista. Una expresión computed_column_expression es determinista cuando se cumplen todas estas condiciones:
Todas las funciones a las que hace referencia la expresión son deterministas y precisas. Esto incluye las funciones definidas por el usuario y las funciones integradas. Para obtener más información, consulte Deterministic and Nondeterministic Functions. Puede que las funciones sean imprecisas si el valor de la columna calculada es
PERSISTED
. Para obtener más información, vea Crear índices en columnas calculadas persistentes más adelante en este artículo.Todas las columnas a las que hace referencia la expresión pertenecen a la tabla que contiene la columna calculada.
Ninguna referencia a las columnas extrae datos de varias filas. Por ejemplo, las funciones de agregado como
SUM
oAVG
dependen de datos de varias filas y convertirán a computed_column_expression en no determinista.La expresión computed_column_expression no tiene acceso a los datos del sistema o de usuario.
Cualquier columna calculada que contenga una expresión CLR (Common Language Runtime) debe ser determinista y se debe marcar como PERSISTED
para poder indexarla. Las expresiones con el tipo definido por el usuario CLR se pueden utilizar en las definiciones de columnas calculadas. Las columnas calculadas con el tipo definido por el usuario CLR se podrán indizar siempre que el tipo sea comparable. Para obtener más información, vea Tipos definidos por el usuario de CLR.
CAST y CONVERT
Cuando haga referencia a los literales de cadena del tipo de datos de fecha en las columnas calculadas indexadas de SQL Server, se recomienda convertir explícitamente el literal al tipo de datos deseado mediante un estilo de formato de fecha determinista. Para obtener una lista de los estilos de formato de fecha deterministas, vea CAST y CONVERT.
Para obtener más información, vea Conversión no determinista de las cadenas de fecha literales en valores DATE.
Nivel de compatibilidad
La conversión implícita de datos de caracteres no Unicode entre intercalaciones se considera no determinista, a menos que el nivel de compatibilidad se establezca en 80
o menos.
Cuando el valor del nivel de compatibilidad de la base de datos es 90
, no se pueden crear índices en columnas calculadas que incluyan estas expresiones. Sin embargo, se pueden mantener las columnas calculadas existentes que contengan estas expresiones procedentes de una base de datos actualizada. Si utiliza columnas calculadas indizadas que contienen conversiones implícitas de cadena a fecha, para evitar posibles daños en las vistas indizadas, asegúrese de que las opciones LANGUAGE
y DATEFORMAT
son coherentes en las bases de datos y las aplicaciones.
El nivel de compatibilidad 90
corresponde a SQL Server 2005 (9.x).
Requisitos de precisión
La expresión computed_column_expression debe ser precisa. Una expresión computed_column_expression es precisa si se cumplen una o varias de las condiciones siguientes:
No es una expresión del tipo de datos float o real.
No utiliza en su definición un tipo de datos float o real. Por ejemplo, en la instrucción siguiente, la columna
y
es int y determinista, pero no precisa.CREATE TABLE t2 (a int, b int, c int, x float, y AS CASE x WHEN 0 THEN a WHEN 1 THEN b ELSE c END);
Nota:
Las expresiones float o real se consideran imprecisas y no pueden ser la clave de un índice; una expresión float o real puede utilizarse en una vista indizada, pero no como clave. Esto también se aplica a las columnas calculadas. Las funciones, expresiones o funciones definidas por el usuario se considerarán imprecisas si incluyen expresiones float o real . Esto incluye a las lógicas (comparaciones).
La propiedad IsPrecise
de la función COLUMNPROPERTY
informa de si una expresión computed_column_expression es precisa.
Requisitos de tipo de datos
- La expresión computed_column_expression definida para la columna calculada no se puede evaluar para los tipos de datos text, ntext o image.
- Las columnas calculadas derivadas de los tipos de datos image, ntext, text, varchar(max), nvarchar(max), varbinary(max)y xml se pueden indexar, siempre que el tipo de datos de la columna calculada esté disponible como una columna de clave de índice.
- Las columnas calculadas derivadas de los tipos de datos image, ntexty text pueden ser columnas sin clave (incluidas) en un índice no agrupado, siempre que el tipo de datos de la columna calculada esté disponible como una columna índice sin clave.
Requisitos de la opción SET
La opción de nivel de conexión
ANSI_NULLS
debe estar establecida enON
si se ejecuta la instrucciónCREATE TABLE
oALTER TABLE
que define la columna calculada. La función OBJECTPROPERTY informa de si la opción está activada a través de la propiedadIsAnsiNullsOn
.La conexión en la que se crea el índice y todos los intentos de conexión de las instrucciones
INSERT
,UPDATE
, oDELETE
que cambiarán los valores del índice deben tener seis opcionesSET
con el valorON
y una con el valorOFF
. El optimizador omitirá un índice de una columna calculada para cualquier instrucciónSELECT
que se ejecute mediante una conexión que no tenga la misma configuración de las opciones.El valor de la opción
NUMERIC_ROUNDABORT
debe serOFF
y el de las opciones siguientes debe serON
:ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Nota:
Al establecer ANSI_WARNINGS
en ON
, ARITHABORT
se establece de forma implícita en ON
cuando el nivel de compatibilidad de base de datos está establecido en 90
o un valor superior.
Crear índices en columnas calculadas persistentes
A veces, puede crear una columna calculada que se define con una expresión que es determinista pero imprecisa. Puede hacerlo cuando la columna esté marcada como PERSISTED
en la instrucción CREATE TABLE
o ALTER TABLE
.
Esto significa que Motor de base de datos almacena los valores calculados en la tabla y los actualiza cuando se actualiza cualquier otra columna de la que depende la columna calculada. Motor de base de datos utiliza estos valores persistentes cuando crea un índice en la columna y cuando se hace referencia al índice en una consulta.
Esta opción permite crear un índice en una columna calculada cuando el motor de base de datos no puede demostrar con exactitud si una función que devuelve expresiones de columnas calculadas, en especial una función CLR creada en .NET Framework, es determinista y precisa.
Nota:
No se puede crear un índice filtrado en una columna calculada.