Operational System
業務処理によるデータ蓄積
小規模トランザクションが多発
IIS Server
業務システム
ユーザー
Operational System
業務処理によるデータ蓄積
小規模トランザクションが多発
IIS Server
業務システム
ユーザー
Analytical System
ETL によるデータウェアハウス作成
Operational System
業務処理によるデータ蓄積
小規模トランザクションが多発
IIS Server
業務システム
ユーザー
Analytical System
ETL によるデータウェアハウス作成
分析に特化したデータ構造
BI アナリスト
Operational System
業務処理によるデータ蓄積
小規模トランザクションが多発
IIS Server
業務システム
ユーザー
Analytical System
ETL によるデータウェアハウス作成
分析に特化したデータ構造
パフォーマンス向上のためにSSASも使用
BI アナリスト
懸案事項…..
IIS Server
業務システム
ユーザー
BI アナリスト
ETLの複雑な実装……
別々のハードウェアが必要……
リアルタイム分析ができない…
IIS Server
業務システム
ユーザー
BI アナリスト
Goal
Operational System で
蓄積したデータを、直接分
析で使えるようにする!
IIS Server
業務システム
ユーザー
BI アナリスト
Goal
Operational System で
蓄積したデータを、直接分
析で使えるようにする!
利点
ETLによるデータ操作不要!
IIS Server
業務システム
ユーザー
BI アナリスト
Goal
Operational System で
蓄積したデータを、直接分
析で使えるようにする!
利点
DWH用マシン不要!
ETLによるデータ操作不要!
リアルタイム分析ができる!
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
少ないIO回数で小規模データへアクセス
• インデックス Seek が有効
定型クエリが主要ワークロード
SELECT
FROM
WHERE
SELECT
FROM
WHERE [社員NO]=911423
大量データの並べ替え
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
SELECT
FROM
GROUP BY [売上年],[売上月],[商品CD]
ORDER BY [売上年],[売上月],[商品CD]
,SUM([売上金額])
大量データのグループ化
大量データの集計
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
クラスタ化/非クラスタ化
インデックスの効果が低い
インデックスを使用しない大量データ
のスキャンが必要
分析のための非定型クエリ多発
インデックスの定義が困難
?
社員NO 売上年 売上月 売上日 売上金額 商品CD 顧客CD ………
160512 2016 12 21 501201 SNE12 56912 ・・・・
231492 2016 01 12 1252011 EBA45 11125 ・・・・
197241 2013 04 25 114352 ESB11 39462 ・・・・
976127 2011 01 19 9822215 AQD09 42531 ・・・・
241378 2015 10 27 421124 KLQ01 72236 ・・・・
291023 2014 11 11 4988712 CVW02 69987 ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
8 KBの論理 I/O 単位からの
脱却
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
・・・・・・ ・・・・ ・・・・ ・・・・ ・・・・ ・・・・・ ・・・・・ ・・・・
列ストアインデックス
列ストアインデックス
社員NO
160512
231492
197241
976127
241378
291023
・・・・・・
・・・・・・
・・・・・・
・・・・・・
・・・・・・
売上年
2016
2016
2013
2011
2015
2014
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
売上月
12
01
04
01
10
11
・・・・
・・・・
・・・・
・・・・
・・・・
売上日
21
12
25
19
27
11
・・・・
・・・・
・・・・
・・・・
・・・・
売上金額
501201
1252011
114352
9822215
421124
4988712
・・・・
・・・・
・・・・
・・・・
・・・・
商品CD
SNE12
EBA45
ESB11
AQD09
KLQ01
CVW02
・・・・・
・・・・
・・・・
・・・・
・・・・
顧客CD
56912
11125
39462
42531
72236
69987
・・・・・
列ごとにデータを保持
列ストアインデックス
社員NO
160512
231492
197241
976127
241378
291023
・・・・・・
・・・・・・
・・・・・・
・・・・・・
・・・・・・
売上年
2016
2016
2013
2011
2015
2014
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
・・・・
売上月
12
01
04
01
10
11
・・・・
・・・・
・・・・
・・・・
・・・・
売上日
21
12
25
19
27
11
・・・・
・・・・
・・・・
・・・・
・・・・
売上金額
501201
1252011
114352
9822215
421124
4988712
・・・・
・・・・
・・・・
・・・・
・・・・
商品CD
SNE12
EBA45
ESB11
AQD09
KLQ01
CVW02
・・・・・
・・・・
・・・・
・・・・
・・・・
顧客CD
56912
11125
39462
42531
72236
69987
・・・・・
セグメントに分割
列ストアインデックス
社員NO
…………….
…………….
…………….
…………….
……………. セグメントごとにデータを圧縮
…………….
…………….
…………….
商品CD
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上金額
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上日
…………….
…………….
…………….
…………….
…………….
売上月
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上年
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
顧客CD
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
社員NO
…………….
…………….
…………….
…………….
…………….
大量データへのアクセスへの対応
必要な列/セグメントにIOを限定
列ごとのデータを高圧縮
…………….
…………….
…………….
商品CD
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上金額
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上日
…………….
…………….
…………….
…………….
…………….
売上月
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
売上年
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
顧客CD
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
…………….
集計/グループ化/並べ替えへの対応
バッチモードによる一括処理
Operational ワークロード
クラスタ化/非クラスタ化インデックス
によるデータアクセス
Analytical ワークロード
列ストアインデックスによる
データアクセス
Operational Analytics の実現
既存のOLTPシステムに列ストアインデックスを追加
アプリケーション変更不要
リアルタイムデータ分析を実現
クエリ オプティマイザが適切なインデックスを選択
列ストア圧縮
バッチモード
2014
列ストア圧縮
バッチモード
列ストア圧縮
バッチモード
プライマリ
データストレージ
バッチモード拡張
バッチモード拡張
データ更新可能
2016
列ストア圧縮
バッチモード
列ストア圧縮
バッチモード
プライマリ
データストレージ
バッチモード拡張
バッチモード拡張
データ更新可能
データ更新可能
フィルタ選択
圧縮猶予設定
セカンダリインデックス
サポート
バッチモード拡張
バッチモード拡張
クラスタ化列ストアインデックス
+
非クラスタ化インデックス
非クラスタ化列ストアインデックス
+
 クラスタ化インデックス
 非クラスタ化インデックス
 ヒープ
必要な列のみ選択できる
インデックス/テーブルサイズを抑制
メンテナンスコストを抑制
Operational Analytics 向き!
クラスタ化/非クラスタ化インデックス
INSERTの場合
クラスタ化/非クラスタ化インデックス
非クラスタ化列ストアインデックス
デルタストア
列ストアインデックスへのデータ追加時
に使用される一時領域
8 KB のページに行ストア形式でデータ
を保持
1,024,000行が蓄積されると列ストア
セグメント形式へ変換
SQL Server 2014 まではページ圧縮
されていたが、SQL Server 2016から
は圧縮無し
DELETEの場合
クラスタ化/非クラスタ化インデックス
DELETEの場合
クラスタ化/非クラスタ化インデックス
非クラスタ化列ストアインデックス
削除バッファ
削除ビット
マップ
削除ビットマップ
セグメントデータの論理削除を実現する
ためのビットマップ
• 削除行のクラスタ化キー/RIDを登録
• データ参照時には削除行を返さないための
フィルターとして作用
削除バッファ
削除ビットマップ登録負荷軽減のための
一時領域
• 削除行のクラスタ化キー/RIDを登録
• 定期的に削除ビットマップに登録
列ストアセグメントは論理削除のみ実施
DELETE FROM [売上テーブル]
WHERE [社員NO]=912345
DELETE FROM [売上テーブル]
WHERE [社員NO]=812143
DELETE FROM [売上テーブル]
WHERE [社員NO]=452142
DELETE FROM [売上テーブル]
WHERE [社員NO]=452142
断片化の悪影響
不適切なデータサイズ
不要なI/Oの発生
削除ビットマップを使用したフィ
ルタが参照時に発生
読み込みパフォーマンスの劣化
UPDATEの場合
クラスタ化/非クラスタ化インデックス
UPDATEの場合
クラスタ化/非クラスタ化インデックス
非クラスタ化列ストアインデックス
削除バッファ
インデックスの
更新オーバーヘッド
クラスタ化/非クラスタ化インデックス+
非クラスタ化列ストアインデックス
高負荷!
-列セグメント化の猶予 -
可能な限りデルタストアでの更新操作
• 非圧縮データを行ストア形式で保持
• 更新オーバーヘッドが小さい
列ストアセグメントの断片化軽減
• 断片化解消にはインデックスの再構築/
再編成が必要
列セグメント化の動作
1. デルタストアに一定量のデータが蓄積される
2. デルタストアが[CLOSED]と設定される
3. バックグラウンド処理でデルタストアが列スト
アセグメントに変換される
列セグメント化の猶予
[CLOSED]設定後の待機時間を「分」
単位で指定
CREATE NONCLUSTERED
COLUMNSTORE INDEX …..
WITH COMPRESSION_DELAY=600
OLTP系のトランザクション処理性能
16%程度向上
分析系クエリの処理時間合計
24%程度短縮
非クラスタ化列ストアインデックス
ディスク上のサイズ
30%程度削減
• データ追加主体のワークロード
• 混合ワークロード (UPDATE/DELETE/INSERT)
• sys. dm_db_column_store_row_group_physical_stats を確認
• 断片化率 10%以上であればCOMPRESSION_DELAY値の変更を検討
-インデックス作成範囲の限定 -
更新多発箇所を除外
CREATE NONLCUSTERED
COLUMNSTORE INDEX …..
WHERE [売上年] >= 2016
AND [売上月] =< 4
更新多発箇所を除外
既存の Operational 環境に、非クラスタ化列ストアイン
デックスを定義することで Analytics にも対応できる!
トランザクションデータから、分析データへの変換を不要にす
ることでリアルタイム分析を実現!
OLTP ワークロード/分析ワークロードの相互干渉を軽減する
ために SQL Server 2016 新機能活用が必須!
DBP-005_SQL Server 2016 Operational Analytics によるデータ活用

DBP-005_SQL Server 2016 Operational Analytics によるデータ活用