Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,677 views

Published on

2017/03/16 三木会
http://www.insight-tec.com/events-seminars/20170316_3moku

Published in: Technology
  • Be the first to comment

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

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

×