今まで、SQL Server 2016 CTP 2 について投稿してきて、メモリ最適化テーブルの検証をしようと思ったのですが、一度インデックスの種類の整理をしたいと思い閑話休題がてら。
調べてみたところ、以下のようになるのではと思います。
行ストア | 列ストア | メモリ最適化 | |||||
クラスター化 | 非クラスター化 | クラスター化 | 非クラスター化 | ハッシュ | 非クラスター化 | ||
行ストア | クラスター化 | – | ○ | × | ○ 2016 から |
× | |
非クラスター化 | ○ | – | ○ 2016 から |
○ 2016 から |
× | ||
列ストア | クラスター化 | × | ○ 2016 から |
– | × | ○ 2016 から |
|
非クラスター化 | ○ 2016 から |
○ 2016 から |
× | – | × | ||
メモリ最適化 | ハッシュ | × | 2016 から |
× | – | ||
非クラスター化 |
■行ストア
クラスター化インデックスと非クラスター化インデックスの概念
CREATE INDEX (Transact-SQL)
Maximum Capacity Specifications for SQL Server
- クラスター化インデックス (CI)
- 1 テーブルにつき 1 つのみ作成可能
- 主キーとして設定可能
- 最大で 32 列インデックスに含めることができる
- SQL Server 2014 までは最大で 16 列
- 最大サイズは 900 バイト
- 非クラスター化インデックスとの共存が可能
- クラスター化列ストアインデックスとの共存は不可能
- 非クラスター化列ストアインデックスとの共存は可能
- SQL Server 2016 から
- 非クラスター化インデックス (NCI)
- 1 テーブルにつき 999 個作成可能
- 主キーとして設定可能
- 最大で 32 列インデックスに含めることができる
- 2014 までは最大で 16 列
- 最大サイズは 1,700 バイト
- SQL Server 2014 までは 900 バイト
- フィルター選択されたインデックスとして作成することが可能
- インデックスに付加列を含めることが可能
- クラスター化インデックスとの共存が可能
- クラスター化列ストアインデックスとの共存が可能
- SQL Server 2016 から
- 非クラスター化列ストアインデックスとの共存が可能
- SQL Server 2016 から
■列ストア
列ストア インデックスの説明
CREATE CLUSTERED COLUMNSTORE INDEX (Transact-SQL)
CREATE COLUMNSTORE INDEX (Transact-SQL)
- クラスター化列ストアインデックス (CCI)
- 1 テーブルにつき 1 つのみ作成可能
- 最大で 1,024 列 インデックスに含めることができる
- テーブルのすべての列を含めることが可能
- 主キーとして設定できない
- 非クラスター化インデックスで主キーを設定することが可能
- SQL Server 2016 から
- 非クラスター化インデックスで主キーを設定することが可能
- クラスター化インデックスとの共存は不可能
- 複数のクラスター化インデックスはサポートされていない
- 非クラスター化インデックスとの共存が可能
- SQL Server 2016 から
- 非クラスター化列ストアインデックスとの共存は不可能
- 複数の列ストアインデックスはサポートされていない
- メモリ最適化テーブルとの共存が可能
- SQL Server 2016 から
- メモリ最適化テーブルは SCHEMA_AND_DATA を使う
- Row Store や Deleted Rows Table 等にメモリ最適化テーブルを利用し、バックグラウンドタスクで列ストア化 (通常の列ストアの動作をメモリ最適化テーブルを組み合わせ効率化)
- 非クラスター化列ストアインデックス (NCI)
- 1 テーブルにつき 1 つのみ作成可能
- 最大で 1,024 列 インデックスに含めることができる
- テーブルのすべての列を含めることが可能
- 主キーとして設定できない
- クラスター化インデックス / 非クラスター化インデックスで主キーを設定することが可能
- クラスター化インデックスとの共存が可能
- SQL Server 2016 から
- 非クラスター化インデックスとの共存が可能
- SQL Server 2016 から
- クラスター化列ストアインデックスとの共存は不可能
- 複数の列ストアインデックスはサポートされていない
- フィルター選択されたインデックスとして作成することが可能
- メモリ最適化テーブルとの共存は不可能
■メモリ最適化テーブル
- 共通
- クラスター化インデックスは含めることができない
- 最低一つのインデックスまたは主キーを含む必要がある
- SCHEMA_AND_DATA を使用する場合は主キーが必要
- 主キーを設定する場合は非クラスター化インデックスで設定する
- クラスター化インデックスは使用できない
- 主キーを設定する場合は非クラスター化インデックスで設定する
- SCHEMA_AND_DATA を使用する場合は主キーが必要
- クラスター化インデックスとの共存は不可能
- メモ
リ最適化テーブルには最大で 1,024 列含めることができる - 列ストアインデックスとの共存は不可能
- クラスター化列ストアインデックスとの共存が可能
- SCHEMA_AND_DATA の場合のみ設定可能
- SQL Server 2016 から
- 非クラスター化列ストアインデックスとの共存は不可能
メモリ最適化テーブルでのインデックス使用のガイドライン
ハッシュ インデックス
- ハッシュインデックス
- 非クラスター化インデックスと合わせて最大で 8 個作成可能
- インデックスには単一の列のみを含めることができる
- バケットカウントを指定する必要がある
- 非クラスター化インデックス
- ハッシュインデックスと合わせて最大で 8 個作成可能
- 最大で 32 列インデックスに含めることができる
- 2014 までは最大で 16 列
カラムストアインデックスとメモリ最適化テーブルの組合せが2016から出来るとなっていますが、CTP2で検証したところ、2014の時と同様のエラーが出力されます。
CTP2ではまだ未対応なのでしょうか?OSはWindows2012R2です。
わぐ
24 7月 15 at 23:13
列ストアとメモリ最適化テーブルの組み合わせですが、CTP 2 で対応しています。
以下のような構文で作成できるはずですが駄目でしょうか?
2014 では、以下のようなテーブルは作成できませんが、2016 では作成ができるようになっています。
— 列ストアインデックス + メモリ最適化テーブル
CREATE TABLE HK_CI(
Col1 int IDENTITY,
Col2 uniqueidentifier ,
CONSTRAINT PK_HK_CI PRIMARY KEY NONCLUSTERED (Col1),
INDEX CCIX_HK_CI CLUSTERED COLUMNSTORE
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
GO
masayuki.ozawa
26 7月 15 at 11:24
作成することが出来ました、ありがとうございます!!
ちなみに私が作ろうとして駄目だった手順は下記の2通りです。
①テーブル作成
②メモリ最適化オプティマイザーでメモリ最適化テーブル化
③COLUMNSTORE INDEXの作成を行うとエラー発生。
(SQL文、GUIともにどちらからも不可でした。)
①テーブル作成
②GUIからCOLUMNSTORE INDEX CLUSTER を作成
③メモリ最適化オプティマイザーからメモリ最適化テーブル化しようとしたが、COLUMNSTORE INDEX があるため作成できないとのエラー。
わぐ
26 7月 15 at 22:50