More Related Content More from Masayuki Ozawa (20) カラムストアインデックス 最初の一歩2. はじめに
本資料は SQL Server 2012 RC0 をベースに作成し
ています。
そのため、製品版では動作が変わる可能性があります。
あらかじめご了承ください。
3/7 : SQL Server 2012 Virtual Launch Event
http://www.sqlserverlaunch.com/ww/Home
RC : Release Candidate (製品候補版)
2 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
3. 3 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
4. インデックスの種類
行ストアインデックス (Row Store Index)
•従来から実装されているインデックス
•行を基本としてデータを格納
カラムストアインデックス (Column Store Index : CSI)
•SQL Server 2012 Enterprise Edition で使用できるインデックス
•初期は Project “Appolo” と呼ばれていたもの
•PowerPivot で使用されている VertiPack エンジンを採用
•VertiPack は SSAS の Tabular Mode でも使用されている
•列を基本としてデータを格納
4 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
5. 5 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
6. 行ストアインデックス
ID 姓 名 性別
クラスター化インデックス
1 井口 拓海 男
2 平岡 頼子 女
3 小畑 美樹 女
4 小宮 喜一郎 男
5 前川 涼子 女
B-Tree (Balanced Tree) 構造
ページ
ルートノード ID
中間ノード ID ID
ID 姓 名 性別 ID 姓 名 性別 ID 姓 名 性別 ID 姓 名 性別
リーフノード
6 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
7. 行ストアインデックスの基本構成
Index Allocation Map (IAM)
• インデックスで使用しているページの情報を格納
インデックスページ
• インデックスのツリー構造を格納
データページ
• インデックスのデータページ (リーフノード) を格納
7 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
8. 行ストアインデックスの構成
IAM
インデックス
ページ
データページ
In-row data
8 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
9. カラムストアインデックス
ID 姓 名 性別
クラスター化インデックス
1 井口 拓海 男
2 平岡 頼子 女
3 小畑 美樹 女
4 小宮 喜一郎 男
5 前川 涼子 女
Columnstore インデックス
Segment
ID 姓 名 性別 内部構成
1 井口 拓海 男
Row Group 2 平岡 頼子 女
3 小畑 美樹 女
4
5
小宮
前川
喜一郎
涼子
男
女
Dictionary
ID 姓 名 性別
Segment
9 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
10. カラムストアインデックスの基本概念
Segment
• 特定の列のデータをまとめたもの
• 異なる列のデータが同一のセグメントに入ることはない
• 同一データ型のデータが格納域に集約されることで圧縮効率が高まる
• 各セグメントには最大/最小値がメタデータとして格納されている
• セグメントがディスク → メモリの I/O の基本単位
Row Group
• 同一行のデータとなるセグメントをまとめたもの
• カラムストアインデックスは列を基本単位としてデータを格納している
が「行」を取得することも可能
10 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
11. Segment の構成
各 Segment に含まれる行数は同一になる
Row Group として、同一行のデータを識別するため
特定の Segment の行数は同一となる
11 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
12. カラムストアインデックスの構成
Large Object data
12 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
14. 14 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
15. 行ストアインデックスのデータ読み取り
SELECT 姓, 名 FROM Person
ページ ID ID 姓 名 性別
1 井口 拓海 男
1 2 平岡 頼子 女
3 小畑 美樹 女
4 小宮 喜一郎 男
2
5 前川 涼子 女
I/O の基本はページ
15 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
16. 行ストアインデックスの実行プラン
データ取得の基本的な実行プランは 4 種類
クラスタ化インデックス Scan
•クラスタ化インデックスの全件読み取り
クラスタ化インデックス Seek
•クラスタ化インデックスを使用して特定データを読み取り
非クラスタ化インデックス Scan
•クラスタ化インデックスの全件読み取り
非クラスタ化インデックス Seek
•非クラスタ化インデックスを使用して特定データを読み取り
16 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
17. カラムストアインデックスのデータ読み取り
SELECT 姓, 名 FROM Person
Segment Segment Segment Segment
ID 姓 名 性別
1 井口 拓海 男
RowGroup 2 平岡 頼子 女
3 小畑 美樹 女
4 小宮 喜一郎 男
RowGroup
5 前川 涼子 女
I/O の基本はセグメント
17 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
18. カラムストアインデックスの実行プラン
Scan 操作のみ
Seek のプランは存在しない。カラムストアインデックスを使
用した場合は、「Columnstore インデックス スキャン」 と
なる
Scan は対象となるセグメントのみを走査
全セグメント (データの取得対象ではない列) を走査しているわけ
ではない
18 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
20. 非クラスター化カラムストアインデックス
現在のバージョンではカラムストアインデックスは「非クラ
スター化インデックス」としてのみ作成が可能
SQL Server 2012 のサービスパック またはそれ以降のリリース
ではクラスター化カラムストアインデックスが作成できるように
なる予定 (と SQL Server 2012 の書籍に書いてありました)
カラムストアインデックスは 1 テーブルに 1 つのみ作成可能
インデックスビュー / フィルタされたカラムストアインデックス
は作成できない
20 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
21. 21 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
22. カラムストアインデックスの制限
一部のデータ型を含めることができない
•binary / varbinary / ntext / text / image / varchar(max) / nvarchar(max) / uniqueidentifier / timestamp
/ sql_variant/ decimal (18 桁以上) numeric (18 桁以上) / datetimeoffset (2 桁以上) / CLR 型 (hierarchyid
/ spatial types) / xml
•CSI に含められないデータ型をプライマリーキーにしていると、CSI が作成できないので注意
設定可能な列数
•1023 列を含むインデックスが作成可能
•テーブルの最大列数は 1024 なのでほぼすべての列をインデックスに含むことができる
•クラスター化 / 非クラスター化インデックスの最大列数は 16
•900 バイト以上のデータをインデックスに含むことができる
•クラスター化 / 非クラスター化インデックスは、インデックス内に含める列のサイズの合計を 900
バイト以内にする必要がある (付加列インデックスを除く)
データの更新
•Columnstore インデックスを設定している場合、テーブルを直接更新することはできない
•パーティショニングと組み合わせてパーティションのスイッチをすることでデータの追加は可能
22 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
23. 使用時のポイント
データ追加のワークロードについてはパーティショニング必須
パーティションをスイッチしてデータを追加
大量のデータが格納されているファクトテーブル (スタースキーマ
の中心) またはディメンションテーブル (属性) で使用すると効果的
テーブルを結合するときはハッシュテーブルがメモリ内におさまるよう
にする (インメモリで操作が完了するメモリのサイジング)
カラムストアインデックス作成時にメモリが不足すると作成できな
い
必要となる要求メモリ (MB) の概算 = ((4.2 × CSI に含める列数) +
68) × DOP (作成時の CPU の並列度) + (文字型の列数 × 34)
カラムストアインデックスに含める列数がメモリに影響してくる
カラムストアインデックスに対する結合条件は単一の列にする
複数の列で結合をするとレスポンスに影響がでる可能性がある
バッチモードで実行されるようにクエリを記述する
実行プランを確認する
23 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
24. カラムストアインデックスを使用しない
実行するクエリによってはカラムストアインデック
スではなく行ストアインデックスを使用したほうが
効率の良い場合がある
少量のデータ検索など
カラムストアインデックスを使用しないクエリヒン
トが用意されている
SELECT COUNT(姓) FROM PersonalInfo WHERE 姓 = '小澤'
OPTION
(IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX)
24 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
25. カラムストアインデックス作成時のメモリ不足
カラムストアインデックス時にメモリ (Granted Workspace
Memory) が確保できないとエラーが発生する。
SQL Server ではリソースガバナーの default リソースプールで
Workspace Memory として確保できるメモリは 25% となって
いる (メモリ許可の割合) ので注意が必要
カラムストアインデックス作成用のリソースプールを用意
作成時に必要となるメモリは列数に依存するところが大きい
int × 1 + char(1) × 1022 のテーブルに 1 レコードのみ挿入してカラムストア
インデックスを作成すると 4.2GB 程度のメモリが必要であった
25 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
26. カラムストアインデックスの更新
カラムストアインデックスを設定したテーブルを更
新することはできない
26 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
27. 27 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
28. 2 種類の実行モード
行モード (Row Mode)
• 結合、フィルター処理、集計のいずれも実行されない場合
• CSI の効果は圧縮と読み取り列数の削減に限定される
• 一部のクエリ演算子はバッチモードに対応していないので行モードで
実行される
バッチモード (Batch Mode)
• 高度なクエリ実行テクノロジ (Vector モードを使用したバッチプロセ
ス) により、バッチと呼ばれる列のまとまりが効率的に処理され、
CPU 使用率が下がる
• 結合時のハッシュテーブル作成時の効率が変わってくる
28 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
29. ハッシュ結合時の動作の違い (ロードバランス)
行モード バッチモード
Hast Table
(共有)
Hash Join Hash Join
プローブ側 ビルド側
スレッド1 スレッド3 スレッド1 スレッド3
Exchange Exchange Exchange Exchange
スレッド2 スレッド2
プローブ入力 ビルド入力 バッチ バッチ
バッチ1 バッチ2 バッチ1 バッチ2
(2番目の入力から (最初の入力からの 3 3
の読み取り:右入力 読み取り:左入力)
バッチ バッチ
… n … n
出展元 : Accelerating DWH with Denali Column Stores
29 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
30. ハッシュ結合時の実行プランの違い
行モードのハッシュテーブルの作成
バッチモードのハッシュテーブルの作成
バッチハッシュテーブルの構築 (BatchHashTableBuild)
が使用されている
30 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
31. 実行プランで確認
行モード バッチモード
31 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
32. プロパティから確認
行モード バッチモード
32 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
33. 並列クエリの必要性
並列クエリを使用しないとバッチモードで実行されない
(ようです)
33 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
35. 35 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
36. データ追加のワークロードには対応可能
データの追加はパーティショニングを使用する
パーティションのスイッチをすることでデータを追加す
ることができる。
ファイル ファイル ファイル ファイル
テーブル
グループ 1 グループ 2 グループ 3 グループ 4
アーカイブ
テーブル
トランザクション
テーブル
36 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
37. スイッチ時の注意点
パーティションをスイッチする際には、トランザクションテーブル
に対してカラムストアインデックスを作成する必要がある
スイッチ元 / スイッチ先ともに同じインデックスが付与されている必要
があるため
スイッチの前に空きパーティションを一つ作成する必要がある
パーティションに空きがない状態だと追加のパーティションを設定
(SPLIT) することができない
この状態になった場合、データを追加するためには一度カラムストアイ
ンデックスを削除する必要がある
37 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
38. 推奨されるパーティション
スイッチ前は常に以下のようなパーティションにな
るようにする
ファイル ファイル ファイル ファイル ファイル
テーブル
グループ 1 グループ 2 グループ 3 グループ 4 グループ 5
アーカイブ
テーブル
トランザクション
テーブル
38 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
39. パーティション利用時の流れ
【スタート】
カラムストアインデックスのテーブルに空きのパーティションが 1 つ用意された状態
パーティションを SPLIT し、空きのパーティションを 2 つ用意する
トランザクションテーブルにカラムストアインデックスを追加する
トランザクションテーブルのパーティションをスイッチする
トランザクションテーブルのカラムストアインデックスを削除
チェック制約で次にスイッチするパーティションのデータのみが格納されるようにする
39 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
40. UNION を使用して更新系と結合
カラムストアインデックスが設定されているテーブ
ルと更新系 (トランザクション) テーブルを UNION
ALL を使用して結合することで一つの表として見せ
る
(SELECT * FROM PartitionTable_Archive
WHERE 姓 = '小澤')
UNION ALL
(SELECT * FROM PartitionTable
WHERE 姓 = '小澤')
40 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
42. まとめ
現状のカラムストアインデックスは更新ができないので、OLTP ではなく
DWH で使用される機会が多いかと
使用できるデータ型にも制限があるためカラムストアインデックスを使用する場
合はテーブル構造に注意する
将来的には更新にも対応される予定がある
http://enterprisezine.jp/dbonline/detail/3690/?p=3
カラムストアインデックスを使用する際は、パーティションとの併用を検
討
データの追加を行う場合はパーティション必須
カラムストアインデックスは Enterprise Edition の機能なのでパーティションが
使えるエディション
実行プランを確認する
行ストアインデックスのほうが効率が良いクエリとなる可能性の検討
Batch Mode で実行されているかを確認する
メモリサイズに注意する
列数が多いと作成時に要求されるメモリが不足する可能性があるので注意
ハッシュ操作をメモリで完結できるようにする
42 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
43. 43 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net
44. 参考情報
列ストアインデックス
http://msdn.microsoft.com/ja-
jp/library/gg492088(SQL.110).aspx
SQL Server Columnstore Index FAQ
http://social.technet.microsoft.com/wiki/contents/a
rticles/3540.sql-server-columnstore-index-faq.aspx
SQL Server Columnstore Performance Tuning
http://social.technet.microsoft.com/wiki/contents/a
rticles/4995.sql-server-columnstore-performance-
tuning.aspx
Microsoft® SQL Server® 2012 Pocket
Consultant
http://shop.oreilly.com/product/0790145337627.do
44 SQLTO 第 4 回勉強会 2012/02/25
http://www.sqlto.net