Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Base de datos SQL de Microsoft Fabric
Convierta una tabla de almacén de filas en un índice de almacén de columnas agrupado o cree un índice de almacén de columnas no agrupado. Use un índice de almacén de columnas para ejecutar de forma eficaz análisis operativos en tiempo real en una carga de trabajo OLTP o para mejorar la compresión de datos y el rendimiento de las consultas para cargas de trabajo de almacenamiento de datos.
Siga las novedades de los índices de almacén de columnas para obtener las mejoras más recientes de esta característica.
Los índices de almacén de columnas agrupados ordenados se introdujeron en SQL Server 2022 (16.x). Para obtener más información, vea CREATE COLUMNSTORE INDEX. Para obtener disponibilidad de índices de almacén de columnas ordenados, consulte Índices de almacén de columnas: Información general.
A partir de SQL Server 2016 (13.x), puede crear la tabla como un índice de almacén de columnas agrupado. Ya no es necesario crear primero una tabla de almacén de filas y, a continuación, convertirlo en un índice de almacén de columnas agrupado.
Para obtener información sobre las directrices de diseño del índice de almacén de columnas, vea Índices de almacén de columnas: guía de diseño.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis de Azure SQL Database yAUTD de Azure SQL Managed Instance:
-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ORDER (column [ , ...n ] ) ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column [ , ...n ] )
[ ORDER (column [ , ...n ] ) ]
[ WHERE <filter_expression> [ AND <filter_expression> ] ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
<with_option> ::=
DROP_EXISTING = { ON | OFF } -- default is OFF
| MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ MINUTES ] }
| DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]
<on_option>::=
partition_scheme_name ( column_name )
| filegroup_name
| "default"
<filter_expression> ::=
column_name IN ( constant [ , ...n ]
| column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )
Sintaxis para SQL Server:
-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ WITH ( <with_option> [ , ...n ] ) ]
[ ORDER (column [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column [ , ...n ] )
[ ORDER (column [ , ...n ] ) ]
[ WHERE <filter_expression> [ AND <filter_expression> ] ]
[ WITH ( <with_option> [ , ...n ] ) ]
[ ON <on_option> ]
[ ; ]
<with_option> ::=
DROP_EXISTING = { ON | OFF } -- default is OFF
| MAXDOP = max_degree_of_parallelism
| ONLINE = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ MINUTES ] }
| DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]
<on_option>::=
partition_scheme_name ( column_name )
| filegroup_name
| "default"
<filter_expression> ::=
column_name IN ( constant [ , ...n ]
| column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )
Sintaxis de Azure Synapse Analytics and Analytics Platform System (PDW):
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ORDER ( column [ , ...n ] ) ]
[ WITH ( DROP_EXISTING = { ON | OFF } ) ] -- default is OFF
[;]
Disponibilidad de versiones
Algunas de las opciones no están disponibles en todas las versiones del motor de base de datos. En la tabla siguiente se muestran las versiones en las que se presentan las opciones en los índices de almacén de columnas agrupados y no agrupados:
Opción | AGRUPADO | NO AGRUPADO |
---|---|---|
COMPRESSION_DELAY | SQL Server 2016 (13.x) | SQL Server 2016 (13.x) |
COMPRESIÓN_DE_DATOS | SQL Server 2016 (13.x) | SQL Server 2016 (13.x) |
EN LÍNEA | SQL Server 2019 (15.x) | SQL Server 2017 (14.x) |
Cláusula WHERE | No disponible | SQL Server 2016 (13.x) |
Cláusula ORDER | SQL Server 2016 (13.x) | VERSIÓN PRELIMINAR de SQL Server 2025 (17.x) |
Todas las opciones están disponibles en Azure SQL Database y AZURE SQL Managed InstanceAUTD.
Para más información sobre la disponibilidad de características, consulte Novedades de los índices de almacén de columnas.
Argumentos
CREACIÓN DE UN ÍNDICE DE ALMACÉN DE COLUMNAS AGRUPADO
Cree un índice de almacén de columnas agrupado en el que todos los datos se comprimen y almacenan mediante columna. El índice incluye todas las columnas de la tabla y almacena toda la tabla. Si la tabla existente es un montón o un índice agrupado, se convierte en un índice de almacén de columnas agrupado. Si la tabla ya está almacenada como un índice de almacén de columnas agrupado, se quita y se vuelve a generar el índice existente.
Importante
En SQL Database en Fabric, se debe crear un índice de almacén de columnas agrupado dentro del mismo lote o transacción a la que pertenece la tabla a la que pertenece. La adición de un índice de almacén de columnas agrupado a una tabla después de que ya se haya creado puede producir el siguiente error:
Msg 35354, Level 16, State 1, Line 63, The statement failed because a clustered columnstore index cannot be created on a table enabled for Change Feed. Consider disabling Change Feed and then creating the clustered columnstore index.
index_name
Especifica el nombre del nuevo índice.
Si la tabla ya tiene un índice de almacén de columnas agrupado, puede especificar el mismo nombre que el índice existente o puede usar la opción DROP EXISTING para especificar un nuevo nombre.
ON [ database_name. [ schema_name ] . | schema_name . ] table_name
Especifica el nombre de una, dos o tres partes de la tabla que se va a almacenar como un índice de almacén de columnas agrupado. Si la tabla es un montón o tiene un índice agrupado, la tabla se convierte de un almacén de filas a un almacén de columnas. Si la tabla ya es un almacén de columnas, esta instrucción vuelve a generar el índice de almacén de columnas agrupado.
ORDER para el almacén de columnas agrupado
Use la column_store_order_ordinal
columna en sys.index_columns para determinar el orden de las columnas de un índice de almacén de columnas agrupado. La ordenación del almacén de columnas ayuda con la eliminación de segmentos, especialmente con datos de cadena. Para obtener más información, consulte Optimización del rendimiento con índices de almacén de columnas ordenados e Índices de almacén de columnas: guía de diseño.
Para convertir en un índice de almacén de columnas agrupado ordenado, el índice existente debe ser un índice de almacén de columnas agrupado. Use la opción DROP_EXISTING
.
Los tipos de datos loB (los tipos de datos de longitud máxima) no pueden ser la clave de un índice de almacén de columnas agrupado ordenado.
Al crear un índice de almacén de columnas agrupado ordenado, use la MAXDOP = 1
opción para la ordenación de mayor calidad, a cambio de una duración significativamente mayor de la CREATE INDEX
instrucción. Para crear el índice lo más rápido posible, no limite MAXDOP. La mayor calidad de compresión y ordenación podría ayudar a las consultas en el índice de almacén de columnas.
Para obtener disponibilidad de índices de almacén de columnas ordenados, consulte Índices de almacén de columnas: Información general.
Opciones WITH
DROP_EXISTING = [OFF] | EN
DROP_EXISTING = ON
especifica para quitar el índice existente y crear un nuevo índice de almacén de columnas.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (DROP_EXISTING = ON);
El valor predeterminado, DROP_EXISTING = OFF, espera que el nombre del índice sea el mismo que el nombre existente. Se produce un error si el nombre de índice especificado ya existe.
MAXDOP = max_degree_of_parallelism
Esta opción puede invalidar la configuración del servidor de grado máximo de paralelismo existente durante la operación de índice. Use MAXDOP para limitar el número de procesadores usados en una ejecución de plan paralelo. El máximo es de 64 procesadores.
max_degree_of_parallelism valores pueden ser:
- 1, lo que significa suprimir la generación de planes paralelos.
- >1, lo que significa restringir el número máximo de procesadores usados en una operación de índice paralela al número especificado, o menos, en función de la carga de trabajo del sistema actual. Por ejemplo, cuando MAXDOP = 4, el número de procesadores usados es 4 o menos.
- 0 (valor predeterminado), lo que significa usar el número real de procesadores, o menos, en función de la carga de trabajo del sistema actual.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);
Para obtener más información, vea Configuración del servidor: grado máximo de paralelismo y Configuración de operaciones de índice paralelo.
COMPRESSION_DELAY = 0 | delay [ MINUTES ]
Para una tabla basada en disco, delay especifica el número mínimo de minutos que un grupo de filas delta en el estado cerrado debe permanecer en el grupo de filas delta. A continuación, SQL Server puede comprimirlo en el grupo de filas comprimido. Dado que las tablas basadas en disco no realizan un seguimiento de las horas de inserción y actualización en filas individuales, SQL Server aplica el retraso a los grupos de filas delta en estado cerrado.
El valor predeterminado es 0 minutos.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( COMPRESSION_DELAY = 10 MINUTES );
Para obtener recomendaciones sobre cuándo usar COMPRESSION_DELAY, consulte Introducción al almacén de columnas para el análisis operativo en tiempo real.
DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE
Especifica la opción de compresión de datos para la tabla, el número de partición o el intervalo de particiones especificados. Las opciones son las siguientes:
-
COLUMNSTORE
es el valor predeterminado y especifica que se comprima con la compresión de almacén de columnas más eficaz. Esta opción es la opción típica. -
COLUMNSTORE_ARCHIVE
comprime aún más la tabla o partición en un tamaño menor. Use esta opción para situaciones como el archivado, que requiere un tamaño de almacenamiento menor y puede permitirse más tiempo para el almacenamiento y la recuperación.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );
Para más información sobre la compresión, vea Compresión de datos.
ONLINE = [ON | OFF]
-
ON
especifica que el índice de almacén de columnas permanece en línea y está disponible, mientras se compila la nueva copia del índice. -
OFF
especifica que el índice no está disponible para su uso mientras se compila la nueva copia.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );
Opciones on
Con estas opciones, puede especificar opciones para el almacenamiento de datos, como un esquema de partición, un grupo de archivos específico o el grupo de archivos predeterminado. Si no se especifica la opción ON, el índice usa la partición de configuración o la configuración del grupo de archivos de la tabla existente.
partition_scheme_name ( column_name ) especifica el esquema de partición de la tabla. El esquema de partición ya debe existir en la base de datos. Para crear el esquema de partición, consulte CREATE PARTITION SCHEME (Transact-SQL).
column_name especifica la columna con la que se particiona un índice con particiones. Esta columna debe coincidir con el tipo de datos, la longitud y la precisión del argumento de la función de partición que partition_scheme_name está usando.
filegroup_name especifica el grupo de archivos para almacenar el índice de almacén de columnas agrupado. Si no se especifica ninguna ubicación y la tabla no tiene particiones, el índice usa el mismo grupo de archivos que la tabla o vista subyacentes. El grupo de archivos ya debe existir.
Para crear el índice en el grupo de archivos predeterminado, use "default"
o [default]
. Si especifica "default"
, la QUOTED_IDENTIFIER
opción debe ser ON
para la sesión actual.
QUOTED_IDENTIFIER
es ON
de forma predeterminada. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).
CREATE [NONCLUSTERED] COLUMNSTORE INDEX
Cree un índice de almacén de columnas no agrupado en una tabla de almacén de filas almacenada como un montón o un índice agrupado. El índice puede tener una condición filtrada y no es necesario incluir todas las columnas de la tabla subyacente. El índice de almacén de columnas requiere suficiente espacio para almacenar una copia de los datos. Puede actualizar el índice y se actualiza a medida que se cambia la tabla subyacente. El índice de almacén de columnas no agrupado en un índice agrupado permite el análisis en tiempo real.
index_name
Especifica el nombre del índice. index_name debe ser único dentro de la tabla, pero no tiene que ser único dentro de la base de datos. Los nombres de índice deben seguir las reglas de los identificadores.
( column [ ,... n ] )
Especifica las columnas que se van a almacenar. Un índice de almacén de columnas no agrupado está limitado a 1024 columnas.
Cada columna debe ser de un tipo de datos compatible para los índices de almacén de columnas. Consulte Limitaciones y restricciones para obtener una lista de los tipos de datos admitidos.
ON [ database_name. [ schema_name ] . | schema_name . ] table_name
Especifica el nombre de una, dos o tres partes de la tabla que contiene el índice.
ORDER para el almacén de columnas no agrupado
Las columnas especificadas en la ORDER
cláusula para un índice de almacén de columnas no agrupado deben ser un subconjunto de las columnas de clave para el índice.
Use la column_store_order_ordinal
columna en sys.index_columns para determinar el orden de las columnas de un índice de almacén de columnas no agrupado. La ordenación del almacén de columnas ayuda con la eliminación de segmentos, especialmente con datos de cadena. Para obtener más información, consulte Optimización del rendimiento con índices de almacén de columnas ordenados e Índices de almacén de columnas: guía de diseño. Las consideraciones de diseño y rendimiento de estos artículos se aplican generalmente a los índices de almacén de columnas agrupados y no agrupados.
Los tipos de datos loB (los tipos de datos de longitud máxima) no pueden ser la clave de un índice de almacén de columnas no agrupado ordenado.
Al crear un índice de almacén de columnas no agrupado ordenado, use las MAXDOP = 1
opciones para la ordenación de mayor calidad, a cambio de una duración significativamente mayor de la CREATE INDEX
instrucción. Para crear el índice lo más rápido posible, no limite MAXDOP
. La mayor calidad de compresión y ordenación podría ayudar a las consultas en el índice de almacén de columnas.
Para obtener la disponibilidad de los índices de almacén de columnas ordenados, vea Disponibilidad de índices de almacén de columnas ordenados.
Opciones WITH
DROP_EXISTING = [OFF] | EN
DROP_EXISTING = ON El índice existente se quita y se vuelve a generar. El nombre de índice especificado debe ser el mismo que un índice existente actualmente; sin embargo, se puede modificar la definición del índice. Por ejemplo, puede especificar diferentes columnas o opciones de índice.
DROP_EXISTING = OFF
Se muestra un error si el nombre de índice especificado ya existe. El tipo de índice no se puede cambiar mediante DROP_EXISTING. En la sintaxis compatible con versiones anteriores, WITH DROP_EXISTING es equivalente a WITH DROP_EXISTING = ON.
MAXDOP = max_degree_of_parallelism
Invalida la opción de configuración De servidor: grado máximo de paralelismo durante la operación de índice. Use MAXDOP para limitar el número de procesadores usados en una ejecución de plan paralelo. El máximo es de 64 procesadores.
max_degree_of_parallelism valores pueden ser:
- 1, lo que significa suprimir la generación de planes paralelos.
- >1, lo que significa restringir el número máximo de procesadores usados en una operación de índice paralela al número especificado, o menos, en función de la carga de trabajo del sistema actual. Por ejemplo, cuando MAXDOP = 4, el número de procesadores usados es 4 o menos.
- 0 (valor predeterminado), lo que significa usar el número real de procesadores o menos en función de la carga de trabajo del sistema actual.
Para obtener más información, vea Configurar operaciones de índice en paralelo.
Nota:
Las operaciones de índice paralelas no están disponibles en todas las ediciones de Microsoft SQL Server. Para obtener una lista de las características admitidas por las ediciones de SQL Server, consulte Ediciones y características admitidas de SQL Server 2022.
ONLINE = [ON | OFF]
-
ON
especifica que el índice de almacén de columnas permanece en línea y está disponible, mientras se compila la nueva copia del índice. -
OFF
especifica que el índice no está disponible para su uso mientras se compila la nueva copia. En un índice no clúster, la tabla base permanece disponible. Solo el índice de almacén de columnas no agrupado no se usa para satisfacer las consultas hasta que se complete el nuevo índice.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ MINUTES ]
Especifica un límite inferior sobre cuánto tiempo debe permanecer una fila en un grupo de filas delta, antes de que sea apto para la migración a un grupo de filas comprimido. Por ejemplo, puede decir que si una fila no cambia durante 120 minutos, esa fila es apta para comprimir en formato de almacenamiento en columnas.
Para un índice de almacén de columnas en tablas basadas en disco, no se realiza un seguimiento de la hora en que se insertó o actualizó una fila. En su lugar, el tiempo de cierre del grupo de filas delta se usa como proxy para la fila. La duración predeterminada es de 0 minutos. Una fila se migra al almacenamiento en columnas después de que se acumulan 1 millón de filas en el grupo de filas delta y se marca como cerrada.
COMPRESIÓN_DE_DATOS
Especifica la opción de compresión de datos para la tabla, el número de partición o el intervalo de particiones especificados. Solo se aplica a los índices de almacén de columnas, incluidos los clústeres y no agrupados. Las opciones son las siguientes:
-
COLUMNSTORE
es el valor predeterminado y especifica que se comprima con la compresión de almacén de columnas más eficaz. Esta opción es la opción típica. -
COLUMNSTORE_ARCHIVE
comprime aún más la tabla o partición en un tamaño menor. Puede usar esta opción para archivar o para otras situaciones que requieran un tamaño de almacenamiento menor y que puedan permitirse más tiempo para el almacenamiento y la recuperación.
Para más información sobre la compresión, vea Compresión de datos.
WHERE <filter_expression> [ AND <filter_expression> ]
Denominada predicado de filtro, esta opción especifica qué filas se van a incluir en el índice. SQL Server crea estadísticas filtradas en las filas de datos del índice filtrado.
El predicado de filtro usa lógica de comparación simple. Las comparaciones que usan NULL
literales no se permiten con los operadores de comparación. Use los IS NULL
operadores y IS NOT NULL
en su lugar.
Estos son algunos ejemplos de predicados de filtro para la Production.BillOfMaterials
tabla:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Para obtener instrucciones sobre los índices filtrados, consulte Creación de índices filtrados.
Opciones on
Las siguientes opciones especifican los grupos de archivos en los que se crea el índice.
partition_scheme_name ( column_name )
Especifica el esquema de partición que define los grupos de archivos en los que se asignan las particiones de un índice con particiones. El esquema de partición debe existir dentro de la base de datos ejecutando CREATE PARTITION SCHEME.
column_name especifica la columna con la que se particiona un índice con particiones. Esta columna debe coincidir con el tipo de datos, la longitud y la precisión del argumento de la función de partición que partition_scheme_name está usando. column_name no está restringido a las columnas de la definición de índice. Al crear particiones de un índice de almacén de columnas, el motor de base de datos agrega la columna de creación de particiones como una columna del índice, si aún no se ha especificado.
Si la tabla tiene particiones y no se especifican partition_scheme_nameo grupo de archivos, el índice se coloca en el mismo esquema de partición y usa la misma columna de partición que la tabla subyacente.
Un índice de almacén de columnas en una tabla con particiones debe estar alineado con particiones. Para obtener más información sobre los índices de creación de particiones, vea Tablas e índices con particiones.
filegroup_name
Especifica un nombre de grupo de archivos en el que se va a crear el índice. Si no se especifica filegroup_name y la tabla no tiene particiones, el índice usa el mismo grupo de archivos que la tabla subyacente. El grupo de archivos ya debe existir.
"predeterminado"
Crea el índice especificado en el grupo de archivos predeterminado.
El término predeterminado, en este contexto, no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en ON "default"
o ON [default]
. Si "default"
se especifica , la opción QUOTED_IDENTIFIER debe estar activada para la sesión actual, que es la configuración predeterminada. Para obtener más información, consulte SET QUOTED_IDENTIFIER.
Permisos
Requiere el permiso ALTER en la tabla.
Observaciones
Puede crear un índice de almacén de columnas en una tabla temporal. Cuando se quita la tabla o finaliza la sesión, también se quita el índice.
En Fabric SQL Database, las tablas con índices de almacén de columnas agrupados no se reflejan en Fabric OneLake.
Índices filtrados
Un índice filtrado es un índice optimizado y no agrupado, adecuado para las consultas que seleccionan un pequeño porcentaje de filas de una tabla. Usa un predicado de filtro para indexar una parte de los datos de la tabla. Un índice filtrado bien diseñado puede mejorar el rendimiento de las consultas, reducir los costos de almacenamiento y reducir los costos de mantenimiento.
Opciones SET necesarias para índices filtrados
Las opciones SET de la columna de valor requerido son necesarias siempre que se produzca alguna de las condiciones siguientes:
- Se crea un índice filtrado.
- Una operación INSERT, UPDATE, DELETE o MERGE modifica los datos de un índice filtrado.
- El optimizador de consultas usa el índice filtrado para generar el plan de consulta.
Opciones de Set | Valor obligatorio | Valor predeterminado del servidor | Valor PREDETERMINADO DE OLE DB y ODBC | Valor de DB-Library predeterminado |
---|---|---|---|---|
ANSI_NULLS | EN | EN | EN | Apagado |
ANSI_PADDING | EN | EN | EN | Apagado |
ANSI_WARNINGS 1 | EN | EN | EN | Apagado |
ARITHABORT | EN | EN | Apagado | Apagado |
CONCAT_NULL_YIELDS_NULL (Concatena null devuelve null) | EN | EN | EN | Apagado |
ABORTAR_REDONDEO_NUMÉRICO | Apagado | Apagado | Apagado | Apagado |
QUOTED_IDENTIFIER (identificador entre comillas) | EN | EN | EN | Apagado |
1 Establecer ANSI_WARNINGS en ON establece implícitamente ARITHABORT en ON cuando el nivel de compatibilidad de la base de datos se establece en 90 o posterior. Si el nivel de compatibilidad de la base de datos se establece en 80 o versiones anteriores, debe establecer explícitamente la opción ARITHABORT en ON.
Si las opciones SET son incorrectas, se pueden producir las condiciones siguientes:
No se crea el índice filtrado.
El motor de base de datos genera un error y revierte las instrucciones INSERT, UPDATE, DELETE o MERGE que cambian los datos del índice.
El optimizador de consultas no tiene en cuenta el índice en el plan de ejecución de ninguna instrucción Transact-SQL.
Para obtener más información sobre los índices filtrados, consulte Creación de índices filtrados.
Limitaciones y restricciones
Cada columna de un índice de almacén de columnas debe ser de uno de los siguientes tipos de datos empresariales comunes:
- datetimeoffset [ ( n ) ]
- datetime2 [ ( n ) ]
- datetime
- smalldatetime
- fecha
- time [ ( n ) ]
- float [ ( n ) ]
- real [ ( n ) ]
- decimal [ ( precision [ , scale ] ) ]
- numeric [ ( precision [ , scale ] ) ]
- dinero
- Dinero pequeño
- bigint
- Int
- smallint
- tinyint
- bit
- nvarchar [ ( n ) ]
- nvarchar(max)1
- nchar [ ( n ) ]
- varchar [ ( n ) ]
- varchar(max)1
- char [ ( n ) ]
- varbinary [ ( n ) ]
- varbinary(max)1
- binary [ ( n ) ]
- uniqueidentifier2
1 Se aplica a SQL Server 2017 (14.x) y Azure SQL Database en el nivel Premium, nivel Estándar (S3 y versiones posteriores) y a todos los niveles de ofertas de núcleo virtual, solo en índices de almacén de columnas agrupados.
2 Se aplica a SQL Server 2014 (12.x) y versiones posteriores.
Si la tabla subyacente tiene una columna de un tipo de datos que no se admite para los índices de almacén de columnas, debe omitir esa columna del índice de almacén de columnas no agrupado.
Los datos de objetos grandes (LOB) mayores de 8 kilobytes se almacenan en un almacenamiento lob fuera de la fila, con un puntero a la ubicación física almacenada dentro del segmento de columna. El tamaño de los datos almacenados no se notifica en sys.column_store_segments, sys.column_store_dictionaries o sys.dm_db_column_store_row_group_physical_stats.
Las columnas que usan cualquiera de los siguientes tipos de datos no se pueden incluir en un índice de almacén de columnas:
- ntext, text e image
- nvarchar(max), varchar(max)y varbinary(max)1
- rowversion (y marca de tiempo)
- sql_variant
- Tipos CLR (hierarchyid y tipos espaciales)
- XML
- uniqueidentifier2
1 Se aplica a SQL Server 2016 (13.x) y versiones anteriores, así como a índices de almacén de columnas no agrupados.
2 Se aplica a SQL Server 2012 (11.x).
Índices de almacén de columnas no agrupados:
- No se pueden tener más de 1024 columnas.
- No se puede crear como un índice basado en restricciones. Es posible tener restricciones únicas, restricciones de clave principal y restricciones de clave externa en una tabla con un índice de almacén de columnas. Las restricciones siempre se aplican con un índice de almacén de filas. Las restricciones no se pueden aplicar con un índice de almacén de columnas (agrupado o no agrupado).
- No se puede incluir una columna dispersa.
- No se puede cambiar mediante la instrucción ALTER INDEX. Para cambiar el índice no clúster, debe quitar y volver a crear el índice de almacén de columnas en su lugar. Puede usar ALTER INDEX para deshabilitar y recompilar un índice de almacén de columnas.
- No se puede crear mediante la palabra clave INCLUDE.
- No se pueden especificar las
ASC
palabras clave oDESC
en la lista de columnas de índice. Los índices de almacén de columnas se ordenan según los algoritmos de compresión. - En Azure SQL Database, SQL Database en Microsoft Fabric, AZURE SQL Managed InstanceAUTD y SQL Server 2025 (17.x) Preview se pueden ordenar mediante la inclusión de la
ORDER
cláusula . Para obtener más información, consulte Optimización del rendimiento con índices de almacén de columnas ordenados. - No se pueden incluir columnas LOB de tipo nvarchar(max), varchar(max)y varbinary(max) en índices de almacén de columnas no agrupados. Solo los índices de almacén de columnas agrupados admiten tipos loB, a partir de la versión de SQL Server 2017 (14.x), Azure SQL Database (configurado en el nivel Premium, nivel Estándar (S3 y versiones posteriores) y todos los niveles de ofertas de núcleo virtual. Las versiones anteriores no admiten tipos de LOB en índices de almacén de columnas agrupados y no agrupados.
- A partir de SQL Server 2016 (13.x), puede crear un índice de almacén de columnas no agrupado en una vista indizada.
Los índices de almacén de columnas no se pueden combinar con las siguientes características:
- Columnas calculadas. A partir de SQL Server 2017 (14.x), un índice de almacén de columnas agrupado puede contener una columna calculada no persistente. Sin embargo, en SQL Server 2017 (14.x), los índices de almacén de columnas agrupados no pueden contener columnas calculadas persistentes y no se pueden crear índices no clúster en columnas calculadas.
- Compresión de página y fila, y el formato de almacenamiento vardecimal . (Un índice de almacén de columnas ya está comprimido en un formato diferente).
- Replicación con índices de almacén de columnas agrupados. Se admiten índices de almacén de columnas no agrupados. Para obtener más información, consulte sp_addarticle.
- Secuencia de archivos.
No puede usar cursores ni desencadenadores en una tabla con un índice de almacén de columnas agrupado. Esta restricción no se aplica a los índices de almacén de columnas no agrupados. Puede usar cursores y desencadenadores en una tabla con un índice de almacén de columnas no agrupado.
Limitaciones específicas de SQL Server 2014 (12.x):
Las siguientes limitaciones solo se aplican a SQL Server 2014 (12.x). En esta versión, puede usar índices de almacén de columnas agrupados actualizables. Los índices de almacén de columnas no agrupados siguen siendo de solo lectura.
- Seguimiento de cambios. No se puede usar el seguimiento de cambios con índices de almacén de columnas.
- Captura de datos modificados. Esta característica no se puede habilitar en tablas con un índice de almacén de columnas agrupado. A partir de SQL Server 2016 (13.x), la captura de datos modificados se puede habilitar en tablas con un índice de almacén de columnas no agrupado.
- Secundaria legible. No se puede acceder a un índice de almacén de columnas agrupado (CCI) desde una secundaria legible de un grupo de disponibilidad legible AlwaysOn. Puede acceder a un índice de almacén de columnas no agrupado (NCCI) desde una base de datos secundaria legible.
- Varios conjuntos de resultados activos (MARS). SQL Server 2014 (12.x) usa esta característica para las conexiones de solo lectura a tablas con un índice de almacén de columnas. Sin embargo, SQL Server 2014 (12.x) no admite esta característica para las operaciones simultáneas del lenguaje de manipulación de datos (DML) en una tabla con un índice de almacén de columnas. Si intenta usar la característica para este propósito, SQL Server finaliza las conexiones y cancela las transacciones.
- Los índices de almacén de columnas no agrupados no se pueden crear en una vista o vista indizada.
Para obtener información sobre las ventajas y limitaciones de rendimiento de los índices de almacén de columnas, consulte Índices de almacén de columnas: Información general.
Metadatos
Todas las columnas de un índice de almacén de columnas se almacenan en los metadatos como columnas incluidas. El índice de almacén de columnas no tiene columnas de clave. Las siguientes vistas del sistema proporcionan información sobre los índices de almacén de columnas:
- sys.indexes (Transact-SQL)
- sys.index_columns (Transact-SQL)
- sys.partitions (Transact-SQL)
- sys.column_store_segments (Transact-SQL)
- sys.column_store_dictionaries (Transact-SQL)
- sys.column_store_row_groups (Transact-SQL)
Ejemplos: conversión de tabla de almacén de filas a almacén de columnas
Un. Conversión de un montón en un índice de almacén de columnas agrupado
En este ejemplo se crea una tabla como un montón y, a continuación, se convierte en un índice de almacén de columnas agrupado denominado cci_Simple
. La creación del índice de almacén de columnas agrupado cambia el almacenamiento de toda la tabla de almacén de filas a almacén de columnas.
CREATE TABLE dbo.SimpleTable(
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON dbo.SimpleTable;
GO
B. Conversión de un índice agrupado en un índice de almacén de columnas agrupado con el mismo nombre
En este ejemplo se crea una tabla con índice agrupado y, a continuación, se muestra la sintaxis de convertir el índice agrupado en un índice de almacén de columnas agrupado. La creación del índice de almacén de columnas agrupado cambia el almacenamiento de toda la tabla de almacén de filas a almacén de columnas.
CREATE TABLE dbo.SimpleTable2 (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable2 (ProductKey);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON dbo.SimpleTable2
WITH (DROP_EXISTING = ON);
GO
C. Control de índices no clúster al convertir una tabla de almacén de filas en un índice de almacén de columnas
En este ejemplo se muestra cómo controlar índices no clúster al convertir una tabla de almacén de filas en un índice de almacén de columnas. A partir de SQL Server 2016 (13.x), no se requiere ninguna acción especial. SQL Server define y vuelve a generar automáticamente los índices no clúster en el nuevo índice de almacén de columnas agrupado.
Si desea quitar los índices no clúster, use la instrucción DROP INDEX antes de crear el índice de almacén de columnas. La opción DROP EXISTING solo quita el índice agrupado que se está convirtiendo. No quita los índices no agrupados.
En SQL Server 2012 (11.x) y SQL Server 2014 (12.x), no se puede crear un índice no agrupado en un índice de almacén de columnas.
--Create the table for use with this example.
CREATE TABLE dbo.SimpleTable (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
--Create two nonclustered indexes for use with this example
CREATE INDEX nc1_simple ON dbo.SimpleTable (OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable (DueDateKey);
GO
Solo para SQL Server 2012 (11.x) y SQL Server 2014 (12.x), debe quitar los índices no agrupados para crear el índice de almacén de columnas.
DROP INDEX dbo.SimpleTable.nc1_simple;
DROP INDEX dbo.SimpleTable.nc2_simple;
--Convert the rowstore table to a columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON dbo.SimpleTable;
GO
D. Conversión de una tabla de hechos grande de almacén de filas a almacén de columnas
En este ejemplo se explica cómo convertir una tabla de hechos grande de una tabla de almacén de filas en una tabla de almacén de columnas.
Cree una tabla pequeña para usarla en este ejemplo.
--Create a rowstore table with a clustered index and a nonclustered index. CREATE TABLE dbo.MyFactTable ( ProductKey [INT] NOT NULL, OrderDateKey [INT] NOT NULL, DueDateKey [INT] NOT NULL, ShipDateKey [INT] NOT NULL INDEX IDX_CL_MyFactTable CLUSTERED ( ProductKey ) ); --Add a nonclustered index. CREATE INDEX my_index ON dbo.MyFactTable ( ProductKey, OrderDateKey );
Quite todos los índices no clúster de la tabla de almacén de filas. Es posible que quiera crear scripts de los índices para volver a crearlos más adelante.
--Drop all nonclustered indexes DROP INDEX my_index ON dbo.MyFactTable;
Convierta la tabla de almacén de filas en una tabla de almacén de columnas con un índice de almacén de columnas agrupado.
En primer lugar, busque el nombre del índice de almacén de filas agrupado existente. En el paso 1, establecemos el nombre del índice
IDX_CL_MyFactTable
en . Si no se especificó el nombre del índice, se le dio un nombre de índice único generado automáticamente. Puede recuperar el nombre generado automáticamente con la siguiente consulta de ejemplo:SELECT i.object_id, i.name, t.object_id, t.name FROM sys.indexes i INNER JOIN sys.tables t ON i.object_id = t.object_id WHERE i.type_desc = 'CLUSTERED' AND t.name = 'MyFactTable';
Opción 1: quite el índice
IDX_CL_MyFactTable
agrupado existente y conviertaMyFactTable
en almacén de columnas. Cambie el nombre del nuevo índice de almacén de columnas agrupado.--Drop the clustered rowstore index. DROP INDEX [IDX_CL_MyFactTable] ON dbo.MyFactTable; GO --Create a new clustered columnstore index with the name MyCCI. CREATE CLUSTERED COLUMNSTORE INDEX IDX_CCL_MyFactTable ON dbo.MyFactTable; GO
Opción 2: Convertir en almacén de columnas y reutilizar el nombre de índice agrupado de almacén de filas existente.
--Create the clustered columnstore index, --replacing the existing rowstore clustered index of the same name CREATE CLUSTERED COLUMNSTORE INDEX [IDX_CL_MyFactTable] ON dbo.MyFactTable WITH (DROP_EXISTING = ON);
E. Conversión de una tabla de almacén de columnas en una tabla de almacén de filas con un índice agrupado
Para convertir una tabla de almacén de columnas en una tabla de almacén de filas con un índice agrupado, use la instrucción CREATE INDEX con la opción DROP_EXISTING.
CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable] ( ProductKey )
WITH ( DROP_EXISTING = ON );
F. Conversión de una tabla de almacén de columnas en un montón de almacén de filas
Para convertir una tabla de almacén de columnas en un montón de almacén de filas, quite el índice de almacén de columnas agrupado. Esto no suele recomendarse, pero algunos pueden tener usos estrechos. Para obtener más información sobre los montones, consulte Montones (tablas sin índices agrupados).
DROP INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable];
G. Desfragmentación mediante la reorganización del índice de almacén de columnas
Hay dos maneras de mantener el índice de almacén de columnas agrupado. A partir de SQL Server 2016 (13.x), use ALTER INDEX...REORGANIZE
en lugar de REBUILD. Para obtener más información, consulte Grupo de filas de índice de almacén de columnas. En versiones anteriores de SQL Server, puede usar CREATE CLUSTERED COLUMNSTORE INDEX con DROP_EXISTING=ON o ALTER INDEX (Transact-SQL) y la opción REBUILD. Ambos métodos lograron los mismos resultados.
Empiece por determinar el nombre del índice de almacén de columnas agrupado en MyFactTable
.
SELECT i.object_id, i.name, t.object_id, t.name
FROM sys.indexes i
INNER JOIN sys.tables t on i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
AND t.name = 'MyFactTable';
Quite la fragmentación realizando un REORGANIZE en el índice de almacén de columnas.
--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
ON dbo.[MyFactTable]
REORGANIZE;
Ejemplos de índices de almacén de columnas no agrupados
Un. Creación de un índice de almacén de columnas como índice secundario en una tabla de almacén de filas
En este ejemplo se crea un índice de almacén de columnas no agrupado en una tabla de almacén de filas. Solo se puede crear un índice de almacén de columnas en esta situación. El índice de almacén de columnas requiere almacenamiento adicional, ya que contiene una copia de los datos de la tabla de almacén de filas. En este ejemplo se crea una tabla simple y un índice agrupado de almacén de filas y, a continuación, se muestra la sintaxis de crear un índice de almacén de columnas no agrupado.
CREATE TABLE dbo.SimpleTable (
ProductKey [INT] NOT NULL,
OrderDateKey [INT] NOT NULL,
DueDateKey [INT] NOT NULL,
ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable (ProductKey);
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON dbo.SimpleTable (OrderDateKey, DueDateKey, ShipDateKey);
GO
B. Creación de un índice básico de almacén de columnas no agrupado mediante todas las opciones
En el ejemplo siguiente se muestra la sintaxis de crear un índice de almacén de columnas no agrupado en el grupo de archivos DEFAULT, especificando los grados máximos de paralelismo (MAXDOP) como 2.
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable (OrderDateKey, DueDateKey, ShipDateKey)
WITH (DROP_EXISTING = ON,
MAXDOP = 2)
ON "DEFAULT";
GO
C. Creación de un índice de almacén de columnas no agrupado con un predicado filtrado
En el ejemplo siguiente se crea un índice de almacén de columnas no agrupado filtrado en la Production.BillOfMaterials
tabla de la AdventureWorks2022
base de datos de ejemplo. El predicado de filtro puede incluir columnas que no son columnas clave en el índice filtrado. El predicado de este ejemplo selecciona solo las filas donde EndDate
no es NULL.
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIBillOfMaterialsWithEndDate'
AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL;
D. Cambio de los datos en un índice de almacén de columnas no agrupado
Se aplica a: SQL Server 2012 (11.x) a SQL Server 2014 (12.x).
En SQL Server 2014 (12.x) y versiones anteriores, después de crear un índice de almacén de columnas no agrupado en una tabla, no se pueden modificar directamente los datos de esa tabla. Se produce un error en una consulta con INSERT, UPDATE, DELETE o MERGE y devuelve un mensaje de error. Estas son las opciones que puede usar para agregar o modificar los datos de la tabla:
Deshabilite o quite el índice de almacén de columnas. A continuación, puede actualizar los datos de la tabla. Si deshabilita el índice de almacén de columnas, puede volver a generar el índice de almacén de columnas cuando termine de actualizar los datos. Por ejemplo:
ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE; -- update the data in mytable as necessary ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
Cargue datos en una tabla de almacenamiento provisional que no tenga un índice de almacén de columnas. Cree un índice de almacén de columnas en la tabla de almacenamiento provisional. Cambie la tabla de almacenamiento provisional a una partición vacía de la tabla principal.
Cambie una partición de la tabla con el índice columnstore a una tabla de almacenamiento provisional vacía. Si hay un índice de almacén de columnas en la tabla de almacenamiento provisional, deshabilite el índice de almacén de columnas. Realice las actualizaciones. Compile (o recompile) el índice de almacén de columnas. Cambie de nuevo la tabla de preparación a la partición (ahora vacía) de la tabla principal.
Ejemplos: Azure Synapse Analytics, Analytics Platform System (PDW)
Un. Cambio de un índice agrupado a un índice de almacén de columnas agrupado
Mediante la instrucción CREATE CLUSTERED COLUMNSTORE INDEX con DROP_EXISTING = ON, puede hacer lo siguiente:
Cambie un índice agrupado a un índice de almacén de columnas agrupado.
Recompile un índice de almacén de columnas agrupado.
En este ejemplo se crea la xDimProduct
tabla como una tabla de almacén de filas con un índice agrupado. A continuación, el ejemplo usa CREATE CLUSTERED COLUMNSTORE INDEX para cambiar la tabla de una tabla de almacén de filas a una tabla de almacén de columnas.
-- Uses AdventureWorks
IF EXISTS (SELECT name FROM sys.tables
WHERE name = N'xDimProduct'
AND object_id = OBJECT_ID (N'xDimProduct'))
DROP TABLE xDimProduct;
--Create a distributed table with a clustered index.
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)
WITH ( DISTRIBUTION = HASH(ProductKey),
CLUSTERED INDEX (ProductKey) )
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;
Busque automáticamente el nombre del índice agrupado creado para la nueva tabla en los metadatos del sistema mediante sys.indexes
. Por ejemplo:
SELECT i.object_id, i.name, t.object_id, t.name, i.type_desc
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
AND t.name = 'xdimProduct';
Ahora, puede elegir:
- Quite el índice de almacén de columnas agrupado existente con un nombre creado automáticamente y, a continuación, cree un nuevo índice de almacén de columnas agrupado con un nombre definido por el usuario.
- Quite y reemplace el índice existente por un índice de almacén de columnas agrupado, manteniendo el mismo nombre generado por el sistema, como
ClusteredIndex_1bd8af8797f7453182903cc68df48541
.
Por ejemplo:
--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541 on xdimProduct;
GO
CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
ON xdimProduct;
GO
--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
ON xdimProduct
WITH ( DROP_EXISTING = ON );
GO
B. Recompilación de un índice de almacén de columnas agrupado
En el ejemplo anterior, en este ejemplo se usa CREATE CLUSTERED COLUMNSTORE INDEX para recompilar el índice de almacén de columnas agrupado existente, denominado cci_xDimProduct
.
--Rebuild the existing clustered columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = ON );
C. Cambiar el nombre de un índice de almacén de columnas agrupado
Para cambiar el nombre de un índice de almacén de columnas agrupado, quite el índice de almacén de columnas agrupado existente y vuelva a crear el índice con un nuevo nombre.
Se recomienda limitar esta operación a una tabla pequeña o vacía. Tarda mucho tiempo en quitar un índice de almacén de columnas grande, agrupado y volver a generarlo con un nombre diferente.
En este ejemplo se hace referencia al cci_xDimProduct
índice de almacén de columnas agrupado del ejemplo anterior. En este ejemplo se quita el cci_xDimProduct
índice de almacén de columnas agrupado y, a continuación, se vuelve a crear el índice de almacén de columnas agrupado con el nombre mycci_xDimProduct
.
--For illustration purposes, drop the clustered columnstore index.
--The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xDimProduct;
--Create a clustered index with a new name, mycci_xDimProduct.
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = OFF );
D. Conversión de una tabla de almacén de columnas en una tabla de almacén de filas con un índice agrupado
Puede haber una situación para la que quiera quitar un índice de almacén de columnas agrupado y crear un índice agrupado. Al quitar un índice de almacén de columnas agrupado, la tabla se cambia al formato de almacén de filas. En este ejemplo se convierte una tabla de almacén de columnas en una tabla de almacén de filas con un índice agrupado con el mismo nombre. Ninguno de los datos se pierde. Todos los datos van a la tabla de almacén de filas y las columnas enumeradas se convierten en las columnas clave del índice agrupado.
--Drop the clustered columnstore index and create a clustered rowstore index.
--All of the columns are stored in the rowstore clustered index.
--The columns listed are the included columns in the index.
CREATE CLUSTERED INDEX cci_xDimProduct
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)
WITH ( DROP_EXISTING = ON);
E. Volver a convertir una tabla de almacén de columnas en un montón de almacén de filas
Use DROP INDEX para quitar el índice de almacén de columnas agrupado y convertir la tabla en un montón de almacén de filas. En este ejemplo se convierte la cci_xDimProduct
tabla en un montón de almacén de filas. La tabla sigue distribuida, pero se almacena como un montón.
--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xdimProduct;
F. Creación de un índice de almacén de columnas agrupado ordenado en una tabla sin índice
Un índice de almacén de columnas sin ordenar cubre todas las columnas de forma predeterminada, sin necesidad de especificar una lista de columnas. Un índice de almacén de columnas ordenado permite especificar el orden de las columnas. La lista no necesita incluir todas las columnas.
Para obtener más información, consulte Optimización del rendimiento con índices de almacén de columnas ordenados.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE);
G. Conversión de un índice de almacén de columnas agrupado en un índice de almacén de columnas agrupado ordenado
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE)
WITH (DROP_EXISTING = ON);
H. Agregar una columna al orden de un índice de almacén de columnas agrupado ordenado
Puede especificar un orden para las columnas de un índice de almacén de columnas. El índice de almacén de columnas agrupado ordenado originalmente se ordenó solo en la SHIPDATE
columna. En el ejemplo siguiente se agrega la PRODUCTKEY
columna a la ordenación. Para obtener disponibilidad de índices de almacén de columnas ordenados, consulte Índices de almacén de columnas: Información general.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE, PRODUCTKEY)
WITH (DROP_EXISTING = ON);
Yo. Cambiar el ordinal de columnas ordenadas
El índice de almacén de columnas agrupado ordenado originalmente se ordenó en SHIPDATE
, PRODUCTKEY
. En el ejemplo siguiente se cambia el orden a PRODUCTKEY
, SHIPDATE
. Para obtener disponibilidad de índices de almacén de columnas ordenados, consulte Índices de almacén de columnas: Información general.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (PRODUCTKEY,SHIPDATE)
WITH (DROP_EXISTING = ON);
J. Creación de un índice de almacén de columnas agrupado ordenado
Puede crear un índice de almacén de columnas agrupado con claves de ordenación. Al crear un índice de almacén de columnas agrupado ordenado, debe aplicar la sugerencia MAXDOP = 1
de consulta para obtener la máxima calidad de ordenación y duración más corta. Para obtener disponibilidad de índices de almacén de columnas ordenados, consulte Índices de almacén de columnas: Información general.
CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI] ON dbo.FactResellerSalesPartCategoryFull
ORDER (EnglishProductSubcategoryName, EnglishProductName)
WITH (MAXDOP = 1, DROP_EXISTING = ON);
Contenido relacionado
- Índices de almacén de columnas: Información general
- Novedades de los índices de almacén de columnas
- Comience con Columnstore para análisis operativos en tiempo real
- Índices de almacén de columnas de almacenamiento de datos
- Índices de almacén de columnas: rendimiento de las consultas
- Guía de diseño de índices de almacenamiento por columnas