sql server の 列ストアインデックス 入門
TRANSCRIPT
SQL Server の列ストアインデックス入門
2017/03/16 三木会SQLWorld お だ
自己紹介
織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です
http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda
SQLWorld とは
http://sqlworld.org/Twitter:@SQLWorld_JP次のような情報を発信しているコミュニティです
MS の RDBMS である「 SQL Server 」もちろん他の DB の話しも!正規化 / モデリングSQL/NoSQL
World と名乗っていますが、
Worldwideでは無いです!
関西限定!大阪で勉強会を開催しています
今日お話しすること
列ストアインデックスの概要そもそも何?今までと何が違うの?何に使うの?
列ストアインデックスの詳細
注意事項
2016 Enterprise エディションでのお話しが中心です。Standard / Express では一部制限があります。
https://blogs.msdn.microsoft.com/sql_server_team/columnstore-index-standard-and-express-editions-with-sql-server-2016-sp1/
列ストアインデックの概要
列ストアインデックスって何?
名前の通り「列単位」でデータを格納するインデックス2 種類のインデックスがある
クラスター化列ストアインデックスCCI : Clustered Columnstore Index
非クラスター化列ストアインデックスNCCI : Nonclustered Columnstore Index
クラスター化インデックスといえば…
インデックスと言いながら、実データを持っている
インデックスのリーフが実データ
今までと何が違うの?
今までのテーブル ( 行ストア ) は、行単位でデータを格納しています。
データの読み込みはページ単位 (8KB)またはエクステント ( 連続した 8 ページ )単位
クラスター化インデックスのイメージ
列ストア
列単位でデータを格納する行グループ (rowgroup)だいたい 100 万行単位
列セグメント (column segment)各列単位にデータを圧縮して格納する
行グループと列セグメントのイメージ
列ストア
同じ行のデータは、同じ行グループに含まれる列単位なので圧縮効率が高い
同じデータ型列セグメントがデータの読み込み単位
今までと何が違うの?
データの格納方法行単位 <=> 列単位
データの読み込み単位ページ <=> 列セグメント
何に使うの?
大きなテーブルに対して少なくとも 100 万行以上
テーブルスキャンするような条件を指定してもヒットする量が多い
特定の列のみ必要なクエリ
データ分析やバッチ等の集計クエリ
大規模向きな理由
データの読み込む量が行ストアと違う。100 万行のデータを 1 列読み込む場合行ストア: 1 ページ 100 件の場合、 1 万ページ列ストア: 1 セグメント
クエリの実行モードが 2 種類ある行モード (RowMode)バッチモード (BatchMode)バッチと呼ばれる単位で複数をまとめて処理
日本語だとここが分かりやすいhttp://enterprisezine.jp/dbonline/detail/8553?p=2
全部 列ストア にしたら?
制限事項と制約MSDN CREATE COLUMNSTORE INDEXhttps://msdn.microsoft.com/ja-jp/library/gg492153.aspx
日本語訳酷いので、分かりにくい箇所は en-us で
行ストアの方が有利なケースが多い特定の値、狭い範囲での検索Seek は行ストアの方が有利
更新処理
CCI と NCCI どっち使うの?NCCI CCI
対象列 幾つかの列を選択 全ての列ストレージ 利用量は増える。
行ストアに実データ + NCCI のインデックス
実データを列ストアに持っているので、行ストアの圧縮よりも利用量が減る。
ワークロード トランザクション処理と分析の共存
DW 用途更新可否 2016 から可能 可能行の範囲指定 2016 でフィルター条件
可能不可
メモリ最適化テーブルとの共存
不可 2016 から可能参考https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/07/18/columnstore-index-differences-between-clusterednonclustered-columnstore-index/
バージョン毎の機能差異機能 2012 2014 2016
行ストア + 読取専用の NCCI ○ ○ ○
行ストア + 更新可能な NCCI ○
更新可能な CCI ○ ○
CCI + B ツリーインデックス ○
NCCI でのフィルター条件 ○
メモリ最適化テーブルの列ストアインデックス ○
アーカイブ圧縮オプション ○ ○
「列ストア インデックスのバージョン管理機能の概要」 から幾つか紹介https://msdn.microsoft.com/ja-jp/library/dn934994.aspx
列ストアインデックの詳細
更新処理 出来るって何で?
列ストアは、列毎に分かれて圧縮してるのに、どうやって更新処理してるの?
毎回列ストアを作り直してる?そんな事してると、時間が掛かり過ぎる
更新処理は行ストアを利用している!
NCCI でキー列無い時どうなる?
NCCI は列を自由に選べるので、 PK 列が無い場合更新処理ってどうなるの?
データを一意に選択出来ないのに更新?NCCI に PK 列が無い場合は、一意な クラスター化インデックス か RID( 行識別子 ) が勝手に追加されてます。
一意に識別出来る列が勝手に追加されて作成される
更新処理 (CCI)
行ストア( デルタストア:追加されたデータを格納 )
削除済マーク列ストア
更新処理 (CCI)データの追加
行ストア ( デルタストア ) に追加データの削除
行ストア内にある場合:削除列ストア内にある場合:削除済マーク
データの変更行ストア内にある場合:そのまま変更列ストア内にある場合:追加と削除
更新処理 (NCCI)
更新処理 (NCCI)データの追加
行ストア ( デルタストア ) に追加データの削除
行ストア内にある場合:削除列ストア内にある場合:削除バッファーに追加
データの変更追加と削除
データを取得するときは…
列ストアインデックスのメタデータ
一部のデータ型のエンコードで利用sys.column_store_dictionaries
行グループsys.column_store_row_groups
列セグメントsys.column_store_segments
デルタストア / 削除済フラグとかsys.internal_paritions
DEMO更新処理と内部情報
更新処理のざっくりとした流れ
使用可能なデルタストア (OPEN な 行グループ ) が無い時は新しく作る
複数個のデルタストアも可能
デルタストアにある程度データが溜まったら CLOSE になる一定期間経つと CLOSE な 行グループ は圧縮 (COMPRESS) されて列ストアになる
列ストアの検索処理 (Seek)基本 Scan のみ。 Seek は無い
キー指定で 1 件抽出は苦手CCI + b-tree (2016 から )
b-tree で Seek しても、列ストアの KeyLookup が発生 ( 実データが列ストア )
b-tree + NCCIもともと b-tree でデータ持っているので、通常通りのテーブルと同じ動作
列ストアの検索処理 (Scan)データを読まない工夫がされている不要な列セグメントは読み込まない列の除去 (Column Elimination)不要な行グループは読み込まない行の除去 (Row Elimination)
DEMOKeyLookup列の除去 / 行の除去
行の除去のためには…
行グループが欲しい範囲で分かれている事が重要
時系列でデータを追加する追加された順で行グループが出来る
行ストア クラスター化インデックスを利用NCCI は行ストアのクラスター化インデックスの順にデータが追加されるCCI は一度クラスター化インデックスを作成した後に、 drop_existing=ON で CCI を作成する
MAXDOP=1 は必須!
今日ちゃんと話してないこと制限事項圧縮処理 ( アーカイブオプション含む )フィルターされた NCCIメモリ最適化テーブルでの CCIPushDown (集計 / 文字列述語 )一括読込インデックスのメンテナンス
マージポリシー / 遅延オプション
バッチモードバージョン / エディション間での差
参考資料
MSSQL Tiger Team bloghttps://blogs.msdn.microsoft.com/sql_server_team/tag/columnstore-index/SQL Server Database Engine Bloghttps://blogs.msdn.microsoft.com/sqlserverstorageengine/tag/columnstore-index/Niko Neugebauer Columnstorehttp://www.nikoport.com/columnstore/
参考資料
MSDN 列ストア インデックス ガイドhttps://msdn.microsoft.com/ja-jp/library/gg492088(v=sql.130).aspxDB Online 連載「今さら聞けない SQL Server のメモリ最適化テクノロジーと、押さえておきたい SQL Server のデータベースセキュリティ」http://enterprisezine.jp/article/corner/409SE の雑記http://blog.engineer-memo.com/