sql server の 列ストアインデックス 入門

40
SQL Server の のののののののののののの 2017/03/16 ののの SQLWorld の の

Upload: oda-shinsuke

Post on 22-Mar-2017

167 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Sql server の 列ストアインデックス 入門

SQL Server の列ストアインデックス入門

2017/03/16 三木会SQLWorld お だ

Page 2: Sql server の 列ストアインデックス 入門

自己紹介

織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です

http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda

Page 3: Sql server の 列ストアインデックス 入門

SQLWorld とは

http://sqlworld.org/Twitter:@SQLWorld_JP次のような情報を発信しているコミュニティです

MS の RDBMS である「 SQL Server 」もちろん他の DB の話しも!正規化 / モデリングSQL/NoSQL

Page 4: Sql server の 列ストアインデックス 入門

World と名乗っていますが、

    Worldwideでは無いです!

Page 5: Sql server の 列ストアインデックス 入門

 関西限定!大阪で勉強会を開催しています

Page 6: Sql server の 列ストアインデックス 入門

平日夜開催 クエリ書いてみよう

http://tsqlrunner.azurewebsites.net/

Page 7: Sql server の 列ストアインデックス 入門

今日お話しすること

列ストアインデックスの概要そもそも何?今までと何が違うの?何に使うの?

列ストアインデックスの詳細

Page 9: Sql server の 列ストアインデックス 入門

列ストアインデックの概要

Page 10: Sql server の 列ストアインデックス 入門

列ストアインデックスって何?

名前の通り「列単位」でデータを格納するインデックス2 種類のインデックスがある

クラスター化列ストアインデックスCCI : Clustered Columnstore Index

非クラスター化列ストアインデックスNCCI : Nonclustered Columnstore Index

Page 11: Sql server の 列ストアインデックス 入門

クラスター化インデックスといえば…

インデックスと言いながら、実データを持っている

インデックスのリーフが実データ

Page 12: Sql server の 列ストアインデックス 入門

今までと何が違うの?

今までのテーブル ( 行ストア ) は、行単位でデータを格納しています。

データの読み込みはページ単位 (8KB)またはエクステント ( 連続した 8 ページ )単位

Page 13: Sql server の 列ストアインデックス 入門

クラスター化インデックスのイメージ

Page 14: Sql server の 列ストアインデックス 入門

列ストア

列単位でデータを格納する行グループ (rowgroup)だいたい 100 万行単位

列セグメント (column segment)各列単位にデータを圧縮して格納する

Page 15: Sql server の 列ストアインデックス 入門

行グループと列セグメントのイメージ

Page 16: Sql server の 列ストアインデックス 入門

列ストア

同じ行のデータは、同じ行グループに含まれる列単位なので圧縮効率が高い

同じデータ型列セグメントがデータの読み込み単位

Page 17: Sql server の 列ストアインデックス 入門

今までと何が違うの?

データの格納方法行単位 <=> 列単位

データの読み込み単位ページ <=> 列セグメント

Page 18: Sql server の 列ストアインデックス 入門

何に使うの?

大きなテーブルに対して少なくとも 100 万行以上

テーブルスキャンするような条件を指定してもヒットする量が多い

特定の列のみ必要なクエリ

データ分析やバッチ等の集計クエリ

Page 19: Sql server の 列ストアインデックス 入門

大規模向きな理由

データの読み込む量が行ストアと違う。100 万行のデータを 1 列読み込む場合行ストア: 1 ページ 100 件の場合、 1 万ページ列ストア: 1 セグメント

クエリの実行モードが 2 種類ある行モード (RowMode)バッチモード (BatchMode)バッチと呼ばれる単位で複数をまとめて処理

日本語だとここが分かりやすいhttp://enterprisezine.jp/dbonline/detail/8553?p=2

Page 20: Sql server の 列ストアインデックス 入門

全部 列ストア にしたら?

制限事項と制約MSDN CREATE COLUMNSTORE INDEXhttps://msdn.microsoft.com/ja-jp/library/gg492153.aspx

日本語訳酷いので、分かりにくい箇所は en-us で

行ストアの方が有利なケースが多い特定の値、狭い範囲での検索Seek は行ストアの方が有利

更新処理

Page 21: Sql server の 列ストアインデックス 入門

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/

Page 22: Sql server の 列ストアインデックス 入門

バージョン毎の機能差異機能 2012 2014 2016

行ストア + 読取専用の NCCI ○ ○ ○

行ストア + 更新可能な NCCI ○

更新可能な CCI ○ ○

CCI + B ツリーインデックス ○

NCCI でのフィルター条件 ○

メモリ最適化テーブルの列ストアインデックス ○

アーカイブ圧縮オプション ○ ○

「列ストア インデックスのバージョン管理機能の概要」 から幾つか紹介https://msdn.microsoft.com/ja-jp/library/dn934994.aspx

Page 23: Sql server の 列ストアインデックス 入門

列ストアインデックの詳細

Page 24: Sql server の 列ストアインデックス 入門

更新処理 出来るって何で?

列ストアは、列毎に分かれて圧縮してるのに、どうやって更新処理してるの?

毎回列ストアを作り直してる?そんな事してると、時間が掛かり過ぎる

更新処理は行ストアを利用している!

Page 25: Sql server の 列ストアインデックス 入門

NCCI でキー列無い時どうなる?

NCCI は列を自由に選べるので、 PK 列が無い場合更新処理ってどうなるの?

データを一意に選択出来ないのに更新?NCCI に PK 列が無い場合は、一意な クラスター化インデックス か RID( 行識別子 ) が勝手に追加されてます。

一意に識別出来る列が勝手に追加されて作成される

Page 26: Sql server の 列ストアインデックス 入門

更新処理 (CCI)

行ストア( デルタストア:追加されたデータを格納 )

削除済マーク列ストア

Page 27: Sql server の 列ストアインデックス 入門

更新処理 (CCI)データの追加

行ストア ( デルタストア ) に追加データの削除

行ストア内にある場合:削除列ストア内にある場合:削除済マーク

データの変更行ストア内にある場合:そのまま変更列ストア内にある場合:追加と削除

Page 28: Sql server の 列ストアインデックス 入門

更新処理 (NCCI)

Page 29: Sql server の 列ストアインデックス 入門

更新処理 (NCCI)データの追加

行ストア ( デルタストア ) に追加データの削除

行ストア内にある場合:削除列ストア内にある場合:削除バッファーに追加

データの変更追加と削除

Page 30: Sql server の 列ストアインデックス 入門

データを取得するときは…

Page 31: Sql server の 列ストアインデックス 入門

列ストアインデックスのメタデータ

一部のデータ型のエンコードで利用sys.column_store_dictionaries

行グループsys.column_store_row_groups

列セグメントsys.column_store_segments

デルタストア / 削除済フラグとかsys.internal_paritions

Page 32: Sql server の 列ストアインデックス 入門

DEMO更新処理と内部情報

Page 33: Sql server の 列ストアインデックス 入門

更新処理のざっくりとした流れ

使用可能なデルタストア (OPEN な 行グループ ) が無い時は新しく作る

複数個のデルタストアも可能

デルタストアにある程度データが溜まったら CLOSE になる一定期間経つと CLOSE な 行グループ は圧縮 (COMPRESS) されて列ストアになる

Page 34: Sql server の 列ストアインデックス 入門

列ストアの検索処理 (Seek)基本 Scan のみ。 Seek は無い

キー指定で 1 件抽出は苦手CCI + b-tree (2016 から )

b-tree で Seek しても、列ストアの KeyLookup が発生 ( 実データが列ストア )

b-tree + NCCIもともと b-tree でデータ持っているので、通常通りのテーブルと同じ動作

Page 35: Sql server の 列ストアインデックス 入門

列ストアの検索処理 (Scan)データを読まない工夫がされている不要な列セグメントは読み込まない列の除去 (Column Elimination)不要な行グループは読み込まない行の除去 (Row Elimination)

Page 36: Sql server の 列ストアインデックス 入門

DEMOKeyLookup列の除去 / 行の除去

Page 37: Sql server の 列ストアインデックス 入門

行の除去のためには…

行グループが欲しい範囲で分かれている事が重要

時系列でデータを追加する追加された順で行グループが出来る

行ストア クラスター化インデックスを利用NCCI は行ストアのクラスター化インデックスの順にデータが追加されるCCI は一度クラスター化インデックスを作成した後に、 drop_existing=ON で CCI を作成する

MAXDOP=1 は必須!

Page 38: Sql server の 列ストアインデックス 入門

今日ちゃんと話してないこと制限事項圧縮処理 ( アーカイブオプション含む )フィルターされた NCCIメモリ最適化テーブルでの CCIPushDown (集計 / 文字列述語 )一括読込インデックスのメンテナンス

マージポリシー / 遅延オプション

バッチモードバージョン / エディション間での差

Page 39: Sql server の 列ストアインデックス 入門

参考資料

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/

Page 40: Sql server の 列ストアインデックス 入門

参考資料

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/