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