Хранилище данных для индексов columnstoreColumnstore indexes - Data Warehouse

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Индексы columnstore в сочетании с секционированием являются необходимым элементом для создания хранилища данных SQL ServerSQL Server .Columnstore indexes, in conjunction with partitioning, are essential for building a SQL ServerSQL Server data warehouse.

новые возможностиWhat's new

ВSQL Server 2016 (13.x)SQL Server 2016 (13.x) появились следующие функции для повышения производительности индексов columnstore:SQL Server 2016 (13.x)SQL Server 2016 (13.x) introduces these features for columnstore performance enhancements:

  • AlwaysOn поддерживает запросы к индексу columnstore в доступной для чтения вторичной реплике.Always On supports querying a columnstore index on a readable secondary replica.
  • Режим MARS поддерживает индексы columnstore.Multiple Active Result Sets (MARS) supports columnstore indexes.
  • Новое динамическое административное представление sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) предоставляет информацию об устранении неполадок производительности на уровне группы строк.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.
  • Однопотоковые запросы по индексам columnstore могут выполняться в пакетном режиме.Single-threaded queries on columnstore indexes can run in batch mode. Ранее в пакетном режиме могли выполняться только многопотоковые запросы.Previously, only multi-threaded queries could run in batch mode.
  • Оператор SORT выполняется в пакетном режиме.The SORT operator runs in batch mode.
  • Множественная операция DISTINCT выполняется в пакетном режиме.Multiple DISTINCT operation runs in batch mode.
  • Статистические операции с окнами теперь выполняются в пакетном режиме для уровня совместимости базы данных 130 или более высокого.Window Aggregates now runs in batch mode for database compatibility level 130 and higher.
  • Включение статических вычислений для эффективной обработки статистических выражений.Aggregate Pushdown for efficient processing of aggregates. Работает с любым уровнем совместимости базы данных.This is supported on all database compatibility levels.
  • Включение предиката строки для эффективной обработки предикатов строк.String predicate pushdown for efficient processing of string predicates. Работает с любым уровнем совместимости базы данных.This is supported on all database compatibility levels.
  • Изоляция моментального снимка для уровня совместимости базы данных 130 или более высокого.Snapshot isolation for database compatibility level 130 and higher.

Повышение производительности благодаря объединению некластеризованных индексов и индексов columnstoreImprove performance by combining nonclustered and columnstore indexes

Начиная с версии SQL Server 2016 (13.x)SQL Server 2016 (13.x) можно определить некластеризованные индексы в кластеризованном индексе columnstore.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can define nonclustered indexes on a clustered columnstore index.

Пример Повышение эффективности операций поиска в таблицах с помощью некластеризованного индексаExample: Improve efficiency of table seeks with a nonclustered index

Для повышения эффективности операций поиска в таблицах хранилища данных можно создать некластеризованный индекс, предназначенный для запуска запросов, которые показывают максимальную производительность с операциями поиска в таблицах.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. Например, запросы, которые ищут совпадающие значения или возвращают небольшой диапазон значений, будут эффективнее выполняться с индексом сбалансированного дерева, а не с индексом columnstore.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. Они не требуют сканирования всей таблицы через индекс columnstore и вернут правильный результат быстрее, выполнив двоичный поиск по индексу сбалансированного дерева.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);  

Пример Использование некластеризованного индекса для принудительного применения ограничения первичного ключа в таблице columnstoreExample: Use a nonclustered index to enforce a primary key constraint on a columnstore table

По умолчанию таблица columnstore не позволяет установить ограничение первичного ключа.By design, a columnstore table does not allow a primary key constraint. Теперь с помощью некластеризованного индекса для таблицы columnstore можно принудительно применить ограничение первичного ключа.Now you can use a nonclustered index on a columnstore table to enforce a primary key constraint. Первичный ключ равнозначен ограничению UNIQUE в столбце, отличном от NULL, а SQL ServerSQL Server реализует ограничение UNIQUE как некластеризованный индекс.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. Эти факты, объединенные в следующем примере, определяют ограничение UNIQUE для столбца accountkey, отличного от NULL.Combining these facts, the following example defines a UNIQUE constraint on the non-NULL column accountkey. Результат представляет собой некластеризованный индекс, принудительно применяющий ограничение первичного ключа в виде ограничения UNIQUE для столбца, отличного от NULL.The result is a nonclustered index that enforces a primary key constraint as a UNIQUE constraint on a non-NULL column.

Далее таблица преобразуется в кластеризованный индекс columnstore.Next, the table is converted to a clustered columnstore index. Во время преобразования некластеризованный индекс сохраняется.During the conversion, the nonclustered index persists. Результат представляет собой кластеризованный индекс columnstore с некластеризованным индексом, принудительно применяющим ограничение первичного ключа.The result is a clustered columnstore index with a nonclustered index that enforces a primary key constraint. Так как любое обновление или вставка в таблице columnstore также повлияет на некластеризованный индекс, все операции, которые нарушают ограничение UNIQUE и отличное от NULL значение, вызовут сбой всей операции.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.

Результат представляет собой индекс columnstore с некластеризованным индексом, принудительно применяющим ограничение первичного ключа для обоих индексов.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); 

Повышение производительности за счет включения блокировки на уровне строки и на уровне группы строкImprove performance by enabling row-level and row-group-level locking

В дополнение к функции некластеризованного индекса для индекса columnstore SQL Server 2016 (13.x)SQL Server 2016 (13.x) предоставляет возможность детализированной блокировки для операций выбора, обновления и удаления.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. Запросы могут выполняться с блокировкой на уровне строки для индексных операций поиска по некластеризованному индексу и блокировкой на уровне группы строк для полного сканирования таблиц по индексу columnstore.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 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  

Изоляция моментальных снимков и изоляция моментальных снимков с чтением фиксированных данныхSnapshot isolation and read-committed snapshot isolations

Изоляция моментальных снимков (SI) позволяет гарантировать согласованность транзакций, а изоляция моментальных снимков с чтением фиксированных данных (RCSI) — согласованность на уровне инструкций для запросов к индексам columnstore.Use snapshot isolation (SI) to guarantee transactional consistency, and read-committed snapshot isolations (RCSI) to guarantee statement level consistency for queries on columnstore indexes. Это позволяет запросам выполняться без блокировки модулей записи данных.This allows the queries to run without blocking data writers. Такое неблокирующее поведение также значительно снижает вероятность взаимоблокировок в сложных транзакциях.This non-blocking behavior also significantly reduces the likelihood of deadlocks for complex transactions. Дополнительные сведения см. в разделе Изоляция моментальных снимков в SQL Server в библиотеке MSDN.For more information, see Snapshot Isolation in SQL Server on MSDN.

См. также:See Also

Руководство по проектированию индексов columnstore Columnstore Indexes Design Guidance
Индексы columnstore. Руководство по загрузке данных Columnstore Indexes Data Loading Guidance
Производительность запросов индексов columnstore Columnstore Indexes Query Performance
Начало работы с Columnstore для получения операционной аналитики в реальном времени Get started with Columnstore for real-time operational analytics
Реорганизация и перестроение индексов Reorganize and Rebuild Indexes
Архитектура индексов columnstoreColumnstore Index Architecture