Almacenamiento de datos de índices de almacén de columnasColumnstore indexes - Data Warehouse

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Los índices de almacén de columnas, junto con las particiones, son esenciales para crear un almacenamiento de datos de SQL ServerSQL Server .Columnstore indexes, in conjunction with partitioning, are essential for building a SQL ServerSQL Server data warehouse.

NovedadesWhat's new

SQL Server 2016 (13.x)SQL Server 2016 (13.x) presenta estas características para mejorar el rendimiento del almacén de columnas:introduces these features for columnstore performance enhancements:

  • AlwaysOn permite consultar un índice de almacén de columnas en una réplica secundaria legible.Always On supports querying a columnstore index on a readable secondary replica.
  • Multiple Active Result Sets (MARS) admite índices de almacén de columnas.Multiple Active Result Sets (MARS) supports columnstore indexes.
  • Una nueva vista de administración dinámica sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) proporciona información de solución de problemas de rendimiento en el nivel de grupo de filas.A new dynamic management view sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) provides performance troubleshooting information at the row group level.
  • Las consultas uniproceso de los índices de almacén de columnas se pueden ejecutar en el modo por lotes.Single-threaded queries on columnstore indexes can run in batch mode. Antes, solo las consultas multiproceso se ejecutaban por lotes.Previously, only multi-threaded queries could run in batch mode.
  • El operador SORT se ejecuta en el modo por lotes.The SORT operator runs in batch mode.
  • Las operaciones DISTINCT múltiples se ejecutan en el modo por lotes.Multiple DISTINCT operation runs in batch mode.
  • Los agregados de ventana ahora se ejecutan en modo por lotes para el nivel de compatibilidad de la base de datos 130 y niveles superiores.Window Aggregates now runs in batch mode for database compatibility level 130 and higher.
  • Aplicación de agregado para un procesamiento eficaz de los agregados.Aggregate Pushdown for efficient processing of aggregates. Se admite en todos los niveles de compatibilidad con bases de datos.This is supported on all database compatibility levels.
  • Aplicación de predicado de cadena para el procesamiento eficaz de los predicados de cadena.String predicate pushdown for efficient processing of string predicates. Se admite en todos los niveles de compatibilidad con bases de datos.This is supported on all database compatibility levels.
  • Aislamiento de instantánea en el nivel de compatibilidad de base de datos 130 y niveles superiores.Snapshot isolation for database compatibility level 130 and higher.

Mejora del rendimiento al combinar índices de almacén de columnas y no agrupadosImprove performance by combining nonclustered and columnstore indexes

A partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x), puede definir índices no agrupados en un índice de almacén de columnas agrupado.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can define nonclustered indexes on a clustered columnstore index.

Ejemplo: Mejorar la eficacia de las búsquedas de tabla con un índice no agrupadoExample: Improve efficiency of table seeks with a nonclustered index

Para mejorar la eficacia de las búsquedas de tabla en un almacenamiento de datos, puede crear un índice no agrupado diseñado para ejecutar consultas que realicen las mejores búsquedas de tabla.To improve efficiency of table seeks in a data warehouse, you can create a nonclustered index designed to run queries that perform best with table seeks. Por ejemplo, las consultas que buscan valores coincidentes o que devuelven un pequeño intervalo de valores tienen un rendimiento mejor en un índice de árbol B que en un índice de almacén de columnas.For example, queries that look for matching values or return a small range of values will perform better against a B-tree index rather than a columnstore index. No requieren un recorrido de tabla completo a través del índice de almacén de columnas y devolverán el resultado correcto más rápidamente si se realiza una búsqueda binaria a través de un índice de árbol B.They don't require a full table scan through the columnstore index and will return the correct result faster by doing a binary search through a B-tree index.

--BASIC EXAMPLE: Create a nonclustered index on a columnstore table.  
  
--Create the table  
CREATE TABLE t_account (  
    AccountKey int NOT NULL,  
    AccountDescription nvarchar (50),  
    AccountType nvarchar(50),  
    UnitSold int  
);  
GO  
  
--Store the table as a columnstore.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account;  
GO  
  
--Add a nonclustered index.  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  

Ejemplo: Usar un índice no agrupado para aplicar una restricción de clave principal en una tabla de almacén de columnasExample: Use a nonclustered index to enforce a primary key constraint on a columnstore table

Por diseño, una tabla de almacén de columnas no permite restricciones de clave principal.By design, a columnstore table does not allow a primary key constraint. Ahora puede usar un índice no agrupado en una tabla de almacén de columnas para aplicar restricciones de clave principal.Now you can use a nonclustered index on a columnstore table to enforce a primary key constraint. Una clave principal equivale a una restricción UNIQUE en una columna no NULL y SQL ServerSQL Server implementa una restricción UNIQUE como un índice no agrupado.A primary key is equivalent to a UNIQUE constraint on a non-NULL column, and SQL ServerSQL Server implements a UNIQUE constraint as a nonclustered index. Combinando ambos factores, en el siguiente ejemplo se define una restricción UNIQUE en la accountkey de la columna no NULL.Combining these facts, the following example defines a UNIQUE constraint on the non-NULL column accountkey. El resultado es un índice no agrupado que aplica una restricción de clave principal como una restricción UNIQUE en una columna no NULL.The result is a nonclustered index that enforces a primary key constraint as a UNIQUE constraint on a non-NULL column.

Luego, la tabla se convierte en un índice de almacén de columnas agrupado.Next, the table is converted to a clustered columnstore index. Durante la conversión, se conserva el índice no agrupado.During the conversion, the nonclustered index persists. El resultado es un índice de almacén de columnas agrupado con un índice no agrupado que aplica una restricción de clave principal.The result is a clustered columnstore index with a nonclustered index that enforces a primary key constraint. Dado que cualquier actualización o inserción en la tabla de almacén de columnas también afectará al índice no agrupado, todas las operaciones que infrinjan la restricción UNIQUE y el valor no NULL harán que se produzca un error en toda la operación.Since any update or insert on the columnstore table will also affect the nonclustered index, all operations that violate the unique constraint and the non-NULL will cause the entire operation to fail.

El resultado es un índice de almacén de columnas con un índice no agrupado que aplica una restricción de clave principal en ambos índices.The result is a columnstore index with a nonclustered index that enforces a primary key constraint on both indexes.

--EXAMPLE: Enforce a primary key constraint on a columnstore table.   
  
--Create a rowstore table with a unique constraint.  
--The unique constraint is implemented as a nonclustered index.  
CREATE TABLE t_account (  
    AccountKey int NOT NULL,  
    AccountDescription nvarchar (50),  
    AccountType nvarchar(50),  
    UnitSold int,  
  
    CONSTRAINT uniq_account UNIQUE (AccountKey)  
);  
  
--Store the table as a columnstore.   
--The unique constraint is preserved as a nonclustered index on the columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account  
  
--By using the previous two steps, every row in the table meets the UNIQUE constraint  
--on a non-NULL column.  
--This has the same end-result as having a primary key constraint  
--All updates and inserts must meet the unique constraint on the nonclustered index or they will fail.  
  
--If desired, add a foreign key constraint on AccountKey.  
  
ALTER TABLE [dbo].[t_account]  
WITH CHECK ADD FOREIGN KEY([AccountKey]) REFERENCES my_dimension(Accountkey); 

Mejorar el rendimiento al habilitar el bloqueo de nivel de fila y de grupo de filasImprove performance by enabling row-level and row-group-level locking

Para complementar al índice no agrupado en una característica de índice de almacén de columnas SQL Server 2016 (13.x)SQL Server 2016 (13.x) ofrece una función de bloqueo pormenorizado para seleccionar, actualizar y eliminar operaciones.To complement the nonclustered index on a columnstore index feature, SQL Server 2016 (13.x)SQL Server 2016 (13.x) offers granular locking capability for select, update, and delete operations. Se pueden ejecutar consultas con un bloqueo de nivel de fila en las búsquedas de índice en un índice no agrupado y con un bloqueo de nivel de grupo de filas en los recorridos de tabla completa en el índice de almacén de columnas.Queries can run with row-level locking on index seeks against a nonclustered index and rowgroup-level locking on full table scans against the columnstore index. Use el bloqueo de nivel de fila y el bloqueo de nivel de grupo de filas adecuadamente para conseguir una mayor simultaneidad de lectura y escritura.Use this to achieve higher read/write concurrency by using row-level and rowgroup-level locking appropriately.

--Granular locking example  
--Store table t_account as a columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account  
GO  
  
--Add a nonclustered index for use with this example  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  
GO  
  
--Look at locking with access through the nonclustered index  
SET TRANSACTION ISOLATION LEVEL repeatable read;  
GO  
  
BEGIN TRAN  
    -- The query plan chooses a seek operation on the nonclustered index  
    -- and takes the row lock  
    SELECT * FROM t_account WHERE AccountKey = 100;  
END TRAN  

Aislamiento de instantánea y aislamientos de instantánea de lectura confirmadaSnapshot isolation and read-committed snapshot isolations

Use el aislamiento de instantánea (SI) para garantizar la coherencia transaccional y los aislamientos de instantánea de lectura confirmada (RCSI) para garantizar la coherencia de nivel de instrucción de las consultas en índices de almacén de columnas.Use snapshot isolation (SI) to guarantee transactional consistency, and read-committed snapshot isolations (RCSI) to guarantee statement level consistency for queries on columnstore indexes. Esto permite que las consultas se ejecuten sin bloquear escrituras de datos.This allows the queries to run without blocking data writers. Este comportamiento de no bloqueo también reduce notablemente la probabilidad de que se produzcan interbloqueos en las transacciones complejas.This non-blocking behavior also significantly reduces the likelihood of deadlocks for complex transactions. Para obtener más información, consulte Aislamiento de instantáneas en SQL Server en MSDN.For more information, see Snapshot Isolation in SQL Server on MSDN.

Consulte tambiénSee Also

Guía de diseño de índices de almacén de columnas Columnstore Indexes Design Guidance
Guía de carga de datos de los índices de almacén de columnas Columnstore Indexes Data Loading Guidance
Rendimiento de las consultas de índices de almacén de columnas Columnstore Indexes Query Performance
Introducción al almacén de columnas para análisis operativos en tiempo real Get started with Columnstore for real-time operational analytics
Reorganizar y volver a generar índices Reorganize and Rebuild Indexes
Arquitectura de los índices de almacén de columnasColumnstore Index Architecture