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.
カラムストアインデックス 最初の一歩            小澤 真之 (@Masayuki_Ozawa)     http://engineermemo.wordpress.com
はじめに     本資料は SQL Server 2012 RC0 をベースに作成し     ています。     そのため、製品版では動作が変わる可能性があります。     あらかじめご了承ください。     3/7 : SQL Server ...
3   SQLTO 第 4 回勉強会         2012/02/25    http://www.sqlto.net
インデックスの種類    行ストアインデックス (Row Store Index)    •従来から実装されているインデックス    •行を基本としてデータを格納    カラムストアインデックス (Column Store Index : CS...
5   SQLTO 第 4 回勉強会         2012/02/25    http://www.sqlto.net
行ストアインデックスID       姓     名         性別                                         クラスター化インデックス     1   井口    拓海        男     2...
行ストアインデックスの基本構成    Index Allocation Map (IAM)    • インデックスで使用しているページの情報を格納    インデックスページ    • インデックスのツリー構造を格納    データページ    •...
行ストアインデックスの構成                              IAM                       インデックス                        ページ                    ...
カラムストアインデックスID          姓           名    性別                                    クラスター化インデックス     1      井口         拓海    男 ...
カラムストアインデックスの基本概念     Segment     • 特定の列のデータをまとめたもの      • 異なる列のデータが同一のセグメントに入ることはない       • 同一データ型のデータが格納域に集約されることで圧縮効率が高...
Segment の構成    各 Segment に含まれる行数は同一になる        Row Group として、同一行のデータを識別するため              特定の Segment の行数は同一となる    11     ...
カラムストアインデックスの構成                              Large Object data12     SQLTO 第 4 回勉強会                         2012/02/25    ...
1,000万件のデータのインデックスサイズ確認     DMV からセグメントの構成を確認13             SQLTO 第 4 回勉強会         2012/02/25               http://www.sql...
14   SQLTO 第 4 回勉強会         2012/02/25     http://www.sqlto.net
行ストアインデックスのデータ読み取り    SELECT 姓, 名 FROM Person         ページ ID   ID               姓                名   性別                  ...
行ストアインデックスの実行プラン    データ取得の基本的な実行プランは 4 種類         クラスタ化インデックス Scan         •クラスタ化インデックスの全件読み取り         クラスタ化インデックス Seek  ...
カラムストアインデックスのデータ読み取り    SELECT 姓, 名 FROM Person                    Segment      Segment             Segment   Segment    ...
カラムストアインデックスの実行プラン    Scan 操作のみ        Seek のプランは存在しない。カラムストアインデックスを使         用した場合は、「Columnstore インデックス スキャン」 と        ...
データ取得方法の違い19            SQLTO 第 4 回勉強会         2012/02/25              http://www.sqlto.net
非クラスター化カラムストアインデックス    現在のバージョンではカラムストアインデックスは「非クラ     スター化インデックス」としてのみ作成が可能        SQL Server 2012 のサービスパック またはそれ以降のリリー...
21   SQLTO 第 4 回勉強会         2012/02/25     http://www.sqlto.net
カラムストアインデックスの制限     一部のデータ型を含めることができない     •binary / varbinary / ntext / text / image / varchar(max) / nvarchar(max) / uni...
使用時のポイント    データ追加のワークロードについてはパーティショニング必須        パーティションをスイッチしてデータを追加    大量のデータが格納されているファクトテーブル (スタースキーマ     の中心) またはディメ...
カラムストアインデックスを使用しない    実行するクエリによってはカラムストアインデック     スではなく行ストアインデックスを使用したほうが     効率の良い場合がある        少量のデータ検索など    カラムストアインデ...
カラムストアインデックス作成時のメモリ不足       カラムストアインデックス時にメモリ (Granted Workspace        Memory) が確保できないとエラーが発生する。               SQL Serv...
カラムストアインデックスの更新    カラムストアインデックスを設定したテーブルを更     新することはできない    26       SQLTO 第 4 回勉強会         2012/02/25             http:...
27   SQLTO 第 4 回勉強会         2012/02/25     http://www.sqlto.net
2 種類の実行モード     行モード (Row Mode)     • 結合、フィルター処理、集計のいずれも実行されない場合      • CSI の効果は圧縮と読み取り列数の削減に限定される     • 一部のクエリ演算子はバッチモードに対...
ハッシュ結合時の動作の違い (ロードバランス)                    行モード                                            バッチモード                         ...
ハッシュ結合時の実行プランの違い    行モードのハッシュテーブルの作成    バッチモードのハッシュテーブルの作成        バッチハッシュテーブルの構築 (BatchHashTableBuild)         が使用されている...
実行プランで確認     行モード                          バッチモード31          SQLTO 第 4 回勉強会              2012/02/25            http://www....
プロパティから確認     行モード                          バッチモード32          SQLTO 第 4 回勉強会              2012/02/25            http://www...
並列クエリの必要性    並列クエリを使用しないとバッチモードで実行されない     (ようです)    33        SQLTO 第 4 回勉強会         2012/02/25              http://www....
バッチモードの実行プラン34            SQLTO 第 4 回勉強会         2012/02/25              http://www.sqlto.net
35   SQLTO 第 4 回勉強会         2012/02/25     http://www.sqlto.net
データ追加のワークロードには対応可能    データの追加はパーティショニングを使用する        パーティションのスイッチをすることでデータを追加す         ることができる。             ファイル       ファイ...
スイッチ時の注意点    パーティションをスイッチする際には、トランザクションテーブル     に対してカラムストアインデックスを作成する必要がある        スイッチ元 / スイッチ先ともに同じインデックスが付与されている必要    ...
推奨されるパーティション      スイッチ前は常に以下のようなパーティションにな       るようにする            ファイル     ファイル         ファイル        ファイル      ファイル テーブル  ...
パーティション利用時の流れ                       【スタート】     カラムストアインデックスのテーブルに空きのパーティションが 1 つ用意された状態        パーティションを SPLIT し、空きのパーティション...
UNION を使用して更新系と結合    カラムストアインデックスが設定されているテーブ     ルと更新系 (トランザクション) テーブルを UNION     ALL を使用して結合することで一つの表として見せ     る     (SE...
パーティションのスイッチを使用したデータの追加41            SQLTO 第 4 回勉強会         2012/02/25              http://www.sqlto.net
まとめ    現状のカラムストアインデックスは更新ができないので、OLTP ではなく     DWH で使用される機会が多いかと        使用できるデータ型にも制限があるためカラムストアインデックスを使用する場         合はテ...
43   SQLTO 第 4 回勉強会         2012/02/25     http://www.sqlto.net
参考情報    列ストアインデックス        http://msdn.microsoft.com/ja-         jp/library/gg492088(SQL.110).aspx    SQL Server Columns...
Upcoming SlideShare
Loading in …5
×

カラムストアインデックス 最初の一歩

5,467 views

Published on

  • Be the first to comment

カラムストアインデックス 最初の一歩

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

×