列ストア インデックス - データ ウェアハウスColumnstore indexes - Data Warehouse

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

列ストア インデックスは、パーティション分割と共に 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) では、列ストアのパフォーマンスを向上させるために、次の機能が導入されています。introduces these features for columnstore performance enhancements:

  • AlwaysOn で、読み取り可能なセカンダリ レプリカで列ストア インデックスのクエリをサポートします。Always On supports querying a columnstore index on a readable secondary replica.
  • 複数のアクティブな結果セット (MARS) で、列ストア インデックスをサポートします。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.
  • 列ストア インデックスでのシングル スレッド クエリは、バッチ モードで実行できます。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.

非クラスター化インデックスと列ストア インデックスを組み合わせてパフォーマンスを改善するImprove performance by combining nonclustered and columnstore indexes

SQL Server 2016 (13.x)SQL Server 2016 (13.x) 以降では、クラスター化列ストア インデックスに非クラスター化インデックスを定義できます。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. たとえば、一致する値を見つけるクエリや、値の小さな範囲を返すクエリは、列ストア インデックスではなく B ツリー インデックスに対して実行したほうが高いパフォーマンスを発揮します。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. このようなクエリでは、列ストア インデックスを介したフル テーブル スキャンは必要ありません。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);  

例: 非クラスター化インデックスを使用して列ストア テーブルに主キー制約を適用するExample: Use a nonclustered index to enforce a primary key constraint on a columnstore table

仕様により、クラスター化された主キー制約を列ストア テーブルに適用することはできません。By design, a columnstore table does not allow a clustered primary key constraint. ただし、列ストア テーブルで非クラスター化インデックスを使用して、主キー制約を適用できるようになりました。Now you can use a nonclustered index on a columnstore table to enforce a primary key constraint. 主キーは非 NULL 列での UNIQUE 制約に相当し、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. これらの事実を組み合わせて、次の例では、非 NULL 列 accountkey に UNIQUE 制約を定義しています。Combining these facts, the following example defines a UNIQUE constraint on the non-NULL column accountkey. その結果、非クラスター化インデックスにより、非 NULL 列の UNIQUE 制約として主キー制約が適用されます。The result is a nonclustered index that enforces a primary key constraint as a UNIQUE constraint on a non-NULL column.

次に、テーブルはクラスター化列ストア インデックスに変換されます。Next, the table is converted to a clustered columnstore index. 変換中は、非クラスター化インデックスが保持されます。During the conversion, the nonclustered index persists. その結果、クラスター化列ストア インデックスに、主キー制約を適用する非クラスター化インデックスが含まれます。The result is a clustered columnstore index with a nonclustered index that enforces a primary key constraint. 列ストア テーブルでの更新または挿入は非クラスター化インデックスにも影響するため、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.

その結果、列ストア インデックスに、両方のインデックスに主キー制約を適用する非クラスター化インデックスが含まれます。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

列ストア インデックス機能で非クラスター化インデックスを補完するために、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. クエリの実行では、非クラスター化インデックスに対するインデックス検索に行レベルのロックを使用できます。また、列ストア インデックスに対するテーブル全体のスキャンに行グループ レベルのロックを使用できます。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  

スナップショット分離と Read Committed スナップショット分離Snapshot isolation and read-committed snapshot isolations

列ストア インデックスのクエリに対し、トランザクションの一貫性を保証するにはスナップショット分離 (SI) を使用し、ステートメント レベルの一貫性を保証するには Read Committed スナップショット分離 (RCSI) を使用します。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. 詳細については、MSDN の「 SQL Server でのスナップショット分離 」を参照してください。For more information, see Snapshot Isolation in SQL Server on MSDN.

参照See Also

列ストア インデックスの設計ガイダンス Columnstore Indexes Design Guidance
列ストア インデックスのデータ読み込みガイダンス Columnstore Indexes Data Loading Guidance
列ストア インデックスのクエリ パフォーマンス Columnstore Indexes Query Performance
列ストアを使用したリアルタイム運用分析の概要 Get started with Columnstore for real-time operational analytics
インデックスの再構成と再構築 Reorganize and Rebuild Indexes
列ストア インデックスのアーキテクチャColumnstore Index Architecture