SlideShare a Scribd company logo
1 of 44
Download to read offline
カラムストアインデックス 最初の一歩


            小澤 真之 (@Masayuki_Ozawa)
     http://engineermemo.wordpress.com
はじめに


     本資料は SQL Server 2012 RC0 をベースに作成し
     ています。
     そのため、製品版では動作が変わる可能性があります。
     あらかじめご了承ください。

     3/7 : SQL Server 2012 Virtual Launch Event
     http://www.sqlserverlaunch.com/ww/Home



RC : Release Candidate (製品候補版)

 2                     SQLTO 第 4 回勉強会         2012/02/25
                       http://www.sqlto.net
3   SQLTO 第 4 回勉強会         2012/02/25
    http://www.sqlto.net
インデックスの種類

    行ストアインデックス (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   SQLTO 第 4 回勉強会         2012/02/25
    http://www.sqlto.net
行ストアインデックス
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
行ストアインデックスの基本構成

    Index Allocation Map (IAM)

    • インデックスで使用しているページの情報を格納


    インデックスページ

    • インデックスのツリー構造を格納


    データページ

    • インデックスのデータページ (リーフノード) を格納


7                     SQLTO 第 4 回勉強会         2012/02/25
                      http://www.sqlto.net
行ストアインデックスの構成
                              IAM



                       インデックス
                        ページ




                      データページ



            In-row data




8      SQLTO 第 4 回勉強会               2012/02/25
       http://www.sqlto.net
カラムストアインデックス
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
カラムストアインデックスの基本概念
     Segment

     • 特定の列のデータをまとめたもの

      • 異なる列のデータが同一のセグメントに入ることはない

       • 同一データ型のデータが格納域に集約されることで圧縮効率が高まる

      • 各セグメントには最大/最小値がメタデータとして格納されている

     • セグメントがディスク → メモリの I/O の基本単位


     Row Group

     • 同一行のデータとなるセグメントをまとめたもの

      • カラムストアインデックスは列を基本単位としてデータを格納している
       が「行」を取得することも可能


10                  SQLTO 第 4 回勉強会         2012/02/25
                    http://www.sqlto.net
Segment の構成
    各 Segment に含まれる行数は同一になる
        Row Group として、同一行のデータを識別するため




              特定の Segment の行数は同一となる

    11                SQLTO 第 4 回勉強会         2012/02/25
                      http://www.sqlto.net
カラムストアインデックスの構成




                              Large Object data




12     SQLTO 第 4 回勉強会                         2012/02/25
       http://www.sqlto.net
1,000万件のデータのインデックスサイズ確認
     DMV からセグメントの構成を確認




13             SQLTO 第 4 回勉強会         2012/02/25
               http://www.sqlto.net
14   SQLTO 第 4 回勉強会         2012/02/25
     http://www.sqlto.net
行ストアインデックスのデータ読み取り
    SELECT 姓, 名 FROM Person

         ページ ID   ID               姓                名   性別
                       1          井口            拓海      男

           1           2          平岡            頼子      女
                       3          小畑            美樹      女
                       4          小宮           喜一郎      男
           2
                       5          前川            涼子      女




                           I/O の基本はページ

    15                       SQLTO 第 4 回勉強会                  2012/02/25
                             http://www.sqlto.net
行ストアインデックスの実行プラン
    データ取得の基本的な実行プランは 4 種類
         クラスタ化インデックス Scan

         •クラスタ化インデックスの全件読み取り




         クラスタ化インデックス Seek

         •クラスタ化インデックスを使用して特定データを読み取り




         非クラスタ化インデックス Scan

         •クラスタ化インデックスの全件読み取り




         非クラスタ化インデックス Seek

         •非クラスタ化インデックスを使用して特定データを読み取り




    16                           SQLTO 第 4 回勉強会         2012/02/25
                                 http://www.sqlto.net
カラムストアインデックスのデータ読み取り
    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
カラムストアインデックスの実行プラン
    Scan 操作のみ
        Seek のプランは存在しない。カラムストアインデックスを使
         用した場合は、「Columnstore インデックス スキャン」 と
         なる
        Scan は対象となるセグメントのみを走査
            全セグメント (データの取得対象ではない列) を走査しているわけ
             ではない




    18                 SQLTO 第 4 回勉強会         2012/02/25
                       http://www.sqlto.net
データ取得方法の違い




19            SQLTO 第 4 回勉強会         2012/02/25
              http://www.sqlto.net
非クラスター化カラムストアインデックス
    現在のバージョンではカラムストアインデックスは「非クラ
     スター化インデックス」としてのみ作成が可能
        SQL Server 2012 のサービスパック またはそれ以降のリリース
         ではクラスター化カラムストアインデックスが作成できるように
         なる予定 (と SQL Server 2012 の書籍に書いてありました)
    カラムストアインデックスは 1 テーブルに 1 つのみ作成可能
        インデックスビュー / フィルタされたカラムストアインデックス
         は作成できない




    20                SQLTO 第 4 回勉強会         2012/02/25
                      http://www.sqlto.net
21   SQLTO 第 4 回勉強会         2012/02/25
     http://www.sqlto.net
カラムストアインデックスの制限
     一部のデータ型を含めることができない

     •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
使用時のポイント
    データ追加のワークロードについてはパーティショニング必須
        パーティションをスイッチしてデータを追加
    大量のデータが格納されているファクトテーブル (スタースキーマ
     の中心) またはディメンションテーブル (属性) で使用すると効果的
        テーブルを結合するときはハッシュテーブルがメモリ内におさまるよう
         にする (インメモリで操作が完了するメモリのサイジング)
    カラムストアインデックス作成時にメモリが不足すると作成できな
     い
        必要となる要求メモリ (MB) の概算 = ((4.2 × CSI に含める列数) +
         68) × DOP (作成時の CPU の並列度) + (文字型の列数 × 34)
        カラムストアインデックスに含める列数がメモリに影響してくる
    カラムストアインデックスに対する結合条件は単一の列にする
        複数の列で結合をするとレスポンスに影響がでる可能性がある
    バッチモードで実行されるようにクエリを記述する
        実行プランを確認する


    23                  SQLTO 第 4 回勉強会         2012/02/25
                        http://www.sqlto.net
カラムストアインデックスを使用しない
    実行するクエリによってはカラムストアインデック
     スではなく行ストアインデックスを使用したほうが
     効率の良い場合がある
        少量のデータ検索など

    カラムストアインデックスを使用しないクエリヒン
     トが用意されている
        SELECT COUNT(姓) FROM PersonalInfo WHERE 姓 = '小澤'
         OPTION
         (IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX)




    24                    SQLTO 第 4 回勉強会           2012/02/25
                          http://www.sqlto.net
カラムストアインデックス作成時のメモリ不足
       カラムストアインデックス時にメモリ (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       SQLTO 第 4 回勉強会         2012/02/25
             http://www.sqlto.net
27   SQLTO 第 4 回勉強会         2012/02/25
     http://www.sqlto.net
2 種類の実行モード
     行モード (Row Mode)

     • 結合、フィルター処理、集計のいずれも実行されない場合

      • CSI の効果は圧縮と読み取り列数の削減に限定される

     • 一部のクエリ演算子はバッチモードに対応していないので行モードで
      実行される


     バッチモード (Batch Mode)

     • 高度なクエリ実行テクノロジ (Vector モードを使用したバッチプロセ
      ス) により、バッチと呼ばれる列のまとまりが効率的に処理され、
      CPU 使用率が下がる

     • 結合時のハッシュテーブル作成時の効率が変わってくる


28                     SQLTO 第 4 回勉強会         2012/02/25
                       http://www.sqlto.net
ハッシュ結合時の動作の違い (ロードバランス)

                    行モード                                            バッチモード
                                                                                  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
ハッシュ結合時の実行プランの違い
    行モードのハッシュテーブルの作成




    バッチモードのハッシュテーブルの作成
        バッチハッシュテーブルの構築 (BatchHashTableBuild)
         が使用されている




    30                    SQLTO 第 4 回勉強会        2012/02/25
                         http://www.sqlto.net
実行プランで確認

     行モード                          バッチモード




31          SQLTO 第 4 回勉強会              2012/02/25
            http://www.sqlto.net
プロパティから確認

     行モード                          バッチモード




32          SQLTO 第 4 回勉強会              2012/02/25
            http://www.sqlto.net
並列クエリの必要性
    並列クエリを使用しないとバッチモードで実行されない
     (ようです)




    33        SQLTO 第 4 回勉強会         2012/02/25
              http://www.sqlto.net
バッチモードの実行プラン




34            SQLTO 第 4 回勉強会         2012/02/25
              http://www.sqlto.net
35   SQLTO 第 4 回勉強会         2012/02/25
     http://www.sqlto.net
データ追加のワークロードには対応可能
    データの追加はパーティショニングを使用する
        パーティションのスイッチをすることでデータを追加す
         ることができる。

             ファイル       ファイル                 ファイル     ファイル
 テーブル
            グループ 1     グループ 2               グループ 3   グループ 4


 アーカイブ
  テーブル




トランザクション
  テーブル




    36               SQLTO 第 4 回勉強会                  2012/02/25
                     http://www.sqlto.net
スイッチ時の注意点
    パーティションをスイッチする際には、トランザクションテーブル
     に対してカラムストアインデックスを作成する必要がある
        スイッチ元 / スイッチ先ともに同じインデックスが付与されている必要
         があるため




    スイッチの前に空きパーティションを一つ作成する必要がある
        パーティションに空きがない状態だと追加のパーティションを設定
         (SPLIT) することができない
        この状態になった場合、データを追加するためには一度カラムストアイ
         ンデックスを削除する必要がある




    37               SQLTO 第 4 回勉強会         2012/02/25
                     http://www.sqlto.net
推奨されるパーティション
      スイッチ前は常に以下のようなパーティションにな
       るようにする

            ファイル     ファイル         ファイル        ファイル      ファイル
 テーブル
           グループ 1   グループ 2       グループ 3      グループ 4    グループ 5


 アーカイブ
  テーブル




トランザクション
  テーブル




      38              SQLTO 第 4 回勉強会                  2012/02/25
                      http://www.sqlto.net
パーティション利用時の流れ
                       【スタート】
     カラムストアインデックスのテーブルに空きのパーティションが 1 つ用意された状態




        パーティションを SPLIT し、空きのパーティションを 2 つ用意する




         トランザクションテーブルにカラムストアインデックスを追加する




           トランザクションテーブルのパーティションをスイッチする




          トランザクションテーブルのカラムストアインデックスを削除
     チェック制約で次にスイッチするパーティションのデータのみが格納されるようにする



39                 SQLTO 第 4 回勉強会               2012/02/25
                   http://www.sqlto.net
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            SQLTO 第 4 回勉強会         2012/02/25
              http://www.sqlto.net
まとめ
    現状のカラムストアインデックスは更新ができないので、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   SQLTO 第 4 回勉強会         2012/02/25
     http://www.sqlto.net
参考情報
    列ストアインデックス
        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

More Related Content

What's hot

Always on 可用性グループ 構築時のポイント
Always on 可用性グループ 構築時のポイントAlways on 可用性グループ 構築時のポイント
Always on 可用性グループ 構築時のポイント
Masayuki Ozawa
 
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
Amazon Web Services Japan
 

What's hot (20)

Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例
 
SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係SparkとCassandraの美味しい関係
SparkとCassandraの美味しい関係
 
Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身Amazon Aurora - Auroraの止まらない進化とその中身
Amazon Aurora - Auroraの止まらない進化とその中身
 
Aws auto scalingによるwebapサーバbatchサーバの構成例
Aws auto scalingによるwebapサーバbatchサーバの構成例Aws auto scalingによるwebapサーバbatchサーバの構成例
Aws auto scalingによるwebapサーバbatchサーバの構成例
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/FallZabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
【GOJAS Meetup-10】Splunk:SmartStoreを使ってみた
【GOJAS Meetup-10】Splunk:SmartStoreを使ってみた【GOJAS Meetup-10】Splunk:SmartStoreを使ってみた
【GOJAS Meetup-10】Splunk:SmartStoreを使ってみた
 
Always on 可用性グループ 構築時のポイント
Always on 可用性グループ 構築時のポイントAlways on 可用性グループ 構築時のポイント
Always on 可用性グループ 構築時のポイント
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 
Azure Log Analytics 概要
Azure Log Analytics 概要Azure Log Analytics 概要
Azure Log Analytics 概要
 
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
 
事例で学ぶApache Cassandra
事例で学ぶApache Cassandra事例で学ぶApache Cassandra
事例で学ぶApache Cassandra
 
A5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますA5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えします
 
CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤CyberAgentのPrivateCloudeを支えるStorage基盤
CyberAgentのPrivateCloudeを支えるStorage基盤
 
Azure Datalake 大全
Azure Datalake 大全Azure Datalake 大全
Azure Datalake 大全
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
 

More from Masayuki Ozawa

db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
Masayuki Ozawa
 
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
Masayuki Ozawa
 
DBA から開発者への情報提供
DBA から開発者への情報提供DBA から開発者への情報提供
DBA から開発者への情報提供
Masayuki Ozawa
 
ここからはじめる SQL Server の状態取得
ここからはじめる SQL Server の状態取得ここからはじめる SQL Server の状態取得
ここからはじめる SQL Server の状態取得
Masayuki Ozawa
 
SQL Server パフォーマンスカウンター
SQL Server パフォーマンスカウンターSQL Server パフォーマンスカウンター
SQL Server パフォーマンスカウンター
Masayuki Ozawa
 
SQL Server 簡易診断サービス ご紹介資料
SQL Server 簡易診断サービス ご紹介資料SQL Server 簡易診断サービス ご紹介資料
SQL Server 簡易診断サービス ご紹介資料
Masayuki Ozawa
 
SQL Server 現状診断サービス ご紹介資料
SQL Server 現状診断サービス ご紹介資料SQL Server 現状診断サービス ご紹介資料
SQL Server 現状診断サービス ご紹介資料
Masayuki Ozawa
 
Sql server 構築 運用 tips
Sql server 構築 運用 tipsSql server 構築 運用 tips
Sql server 構築 運用 tips
Masayuki Ozawa
 
A25 sql server data page structure deep dive
A25 sql server data page structure deep diveA25 sql server data page structure deep dive
A25 sql server data page structure deep dive
Masayuki Ozawa
 

More from Masayuki Ozawa (20)

db tech showcase 2019 SQL Database Hyperscale 徹底分析 - 最新アーキテクチャの特徴を理解する
db tech showcase 2019 SQL Database Hyperscale 徹底分析 - 最新アーキテクチャの特徴を理解するdb tech showcase 2019 SQL Database Hyperscale 徹底分析 - 最新アーキテクチャの特徴を理解する
db tech showcase 2019 SQL Database Hyperscale 徹底分析 - 最新アーキテクチャの特徴を理解する
 
db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
db tech showcase 2019 SQL Server 2019 最新情報 - SQL Serverの進化をまとめてお届け!
 
Sql database managed instance overview and internals
Sql database managed instance overview and internalsSql database managed instance overview and internals
Sql database managed instance overview and internals
 
Power apps formula cheat sheet
Power apps formula cheat sheetPower apps formula cheat sheet
Power apps formula cheat sheet
 
K8s install (single cluster)
K8s install (single cluster)K8s install (single cluster)
K8s install (single cluster)
 
de:code 2018 DA06 SQL Server 管理者におくる SQL Server on Linux Tips
de:code 2018 DA06 SQL Server 管理者におくる SQL Server on Linux Tipsde:code 2018 DA06 SQL Server 管理者におくる SQL Server on Linux Tips
de:code 2018 DA06 SQL Server 管理者におくる SQL Server on Linux Tips
 
Managed Instance チートシート
Managed Instance チートシートManaged Instance チートシート
Managed Instance チートシート
 
Pacemaker 操作方法メモ
Pacemaker 操作方法メモPacemaker 操作方法メモ
Pacemaker 操作方法メモ
 
Windows エンジニア向け sql server on linux のためのスキルアップデート
Windows エンジニア向け sql server on linux のためのスキルアップデートWindows エンジニア向け sql server on linux のためのスキルアップデート
Windows エンジニア向け sql server on linux のためのスキルアップデート
 
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
Dal001 sql server 2017 事始め ~ 進化を続ける sql server の最新情報を一挙紹介
 
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
 
Sql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new featuresSql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new features
 
DBA から開発者への情報提供
DBA から開発者への情報提供DBA から開発者への情報提供
DBA から開発者への情報提供
 
Sql server 2016 ctp 3.0 新機能
Sql server 2016 ctp 3.0 新機能Sql server 2016 ctp 3.0 新機能
Sql server 2016 ctp 3.0 新機能
 
ここからはじめる SQL Server の状態取得
ここからはじめる SQL Server の状態取得ここからはじめる SQL Server の状態取得
ここからはじめる SQL Server の状態取得
 
SQL Server パフォーマンスカウンター
SQL Server パフォーマンスカウンターSQL Server パフォーマンスカウンター
SQL Server パフォーマンスカウンター
 
SQL Server 簡易診断サービス ご紹介資料
SQL Server 簡易診断サービス ご紹介資料SQL Server 簡易診断サービス ご紹介資料
SQL Server 簡易診断サービス ご紹介資料
 
SQL Server 現状診断サービス ご紹介資料
SQL Server 現状診断サービス ご紹介資料SQL Server 現状診断サービス ご紹介資料
SQL Server 現状診断サービス ご紹介資料
 
Sql server 構築 運用 tips
Sql server 構築 運用 tipsSql server 構築 運用 tips
Sql server 構築 運用 tips
 
A25 sql server data page structure deep dive
A25 sql server data page structure deep diveA25 sql server data page structure deep dive
A25 sql server data page structure deep dive
 

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

  • 1. カラムストアインデックス 最初の一歩 小澤 真之 (@Masayuki_Ozawa) http://engineermemo.wordpress.com
  • 2. はじめに 本資料は SQL Server 2012 RC0 をベースに作成し ています。 そのため、製品版では動作が変わる可能性があります。 あらかじめご了承ください。 3/7 : SQL Server 2012 Virtual Launch Event http://www.sqlserverlaunch.com/ww/Home RC : Release Candidate (製品候補版) 2 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 3. 3 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. 行ストアインデックスの基本構成 Index Allocation Map (IAM) • インデックスで使用しているページの情報を格納 インデックスページ • インデックスのツリー構造を格納 データページ • インデックスのデータページ (リーフノード) を格納 7 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 8. 行ストアインデックスの構成 IAM インデックス ページ データページ In-row data 8 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. カラムストアインデックスの基本概念 Segment • 特定の列のデータをまとめたもの • 異なる列のデータが同一のセグメントに入ることはない • 同一データ型のデータが格納域に集約されることで圧縮効率が高まる • 各セグメントには最大/最小値がメタデータとして格納されている • セグメントがディスク → メモリの I/O の基本単位 Row Group • 同一行のデータとなるセグメントをまとめたもの • カラムストアインデックスは列を基本単位としてデータを格納している が「行」を取得することも可能 10 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 11. Segment の構成  各 Segment に含まれる行数は同一になる  Row Group として、同一行のデータを識別するため 特定の Segment の行数は同一となる 11 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 12. カラムストアインデックスの構成 Large Object data 12 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 13. 1,000万件のデータのインデックスサイズ確認 DMV からセグメントの構成を確認 13 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 14. 14 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. 行ストアインデックスの実行プラン  データ取得の基本的な実行プランは 4 種類 クラスタ化インデックス Scan •クラスタ化インデックスの全件読み取り クラスタ化インデックス Seek •クラスタ化インデックスを使用して特定データを読み取り 非クラスタ化インデックス Scan •クラスタ化インデックスの全件読み取り 非クラスタ化インデックス Seek •非クラスタ化インデックスを使用して特定データを読み取り 16 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. カラムストアインデックスの実行プラン  Scan 操作のみ  Seek のプランは存在しない。カラムストアインデックスを使 用した場合は、「Columnstore インデックス スキャン」 と なる  Scan は対象となるセグメントのみを走査  全セグメント (データの取得対象ではない列) を走査しているわけ ではない 18 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 19. データ取得方法の違い 19 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 20. 非クラスター化カラムストアインデックス  現在のバージョンではカラムストアインデックスは「非クラ スター化インデックス」としてのみ作成が可能  SQL Server 2012 のサービスパック またはそれ以降のリリース ではクラスター化カラムストアインデックスが作成できるように なる予定 (と SQL Server 2012 の書籍に書いてありました)  カラムストアインデックスは 1 テーブルに 1 つのみ作成可能  インデックスビュー / フィルタされたカラムストアインデックス は作成できない 20 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 21. 21 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. 使用時のポイント  データ追加のワークロードについてはパーティショニング必須  パーティションをスイッチしてデータを追加  大量のデータが格納されているファクトテーブル (スタースキーマ の中心) またはディメンションテーブル (属性) で使用すると効果的  テーブルを結合するときはハッシュテーブルがメモリ内におさまるよう にする (インメモリで操作が完了するメモリのサイジング)  カラムストアインデックス作成時にメモリが不足すると作成できな い  必要となる要求メモリ (MB) の概算 = ((4.2 × CSI に含める列数) + 68) × DOP (作成時の CPU の並列度) + (文字型の列数 × 34)  カラムストアインデックスに含める列数がメモリに影響してくる  カラムストアインデックスに対する結合条件は単一の列にする  複数の列で結合をするとレスポンスに影響がでる可能性がある  バッチモードで実行されるようにクエリを記述する  実行プランを確認する 23 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 24. カラムストアインデックスを使用しない  実行するクエリによってはカラムストアインデック スではなく行ストアインデックスを使用したほうが 効率の良い場合がある  少量のデータ検索など  カラムストアインデックスを使用しないクエリヒン トが用意されている  SELECT COUNT(姓) FROM PersonalInfo WHERE 姓 = '小澤' OPTION (IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX) 24 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 27. 27 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 28. 2 種類の実行モード 行モード (Row Mode) • 結合、フィルター処理、集計のいずれも実行されない場合 • CSI の効果は圧縮と読み取り列数の削減に限定される • 一部のクエリ演算子はバッチモードに対応していないので行モードで 実行される バッチモード (Batch Mode) • 高度なクエリ実行テクノロジ (Vector モードを使用したバッチプロセ ス) により、バッチと呼ばれる列のまとまりが効率的に処理され、 CPU 使用率が下がる • 結合時のハッシュテーブル作成時の効率が変わってくる 28 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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. ハッシュ結合時の実行プランの違い  行モードのハッシュテーブルの作成  バッチモードのハッシュテーブルの作成  バッチハッシュテーブルの構築 (BatchHashTableBuild) が使用されている 30 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 31. 実行プランで確認 行モード バッチモード 31 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 32. プロパティから確認 行モード バッチモード 32 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 33. 並列クエリの必要性  並列クエリを使用しないとバッチモードで実行されない (ようです) 33 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 34. バッチモードの実行プラン 34 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 35. 35 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 36. データ追加のワークロードには対応可能  データの追加はパーティショニングを使用する  パーティションのスイッチをすることでデータを追加す ることができる。 ファイル ファイル ファイル ファイル テーブル グループ 1 グループ 2 グループ 3 グループ 4 アーカイブ テーブル トランザクション テーブル 36 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 37. スイッチ時の注意点  パーティションをスイッチする際には、トランザクションテーブル に対してカラムストアインデックスを作成する必要がある  スイッチ元 / スイッチ先ともに同じインデックスが付与されている必要 があるため  スイッチの前に空きパーティションを一つ作成する必要がある  パーティションに空きがない状態だと追加のパーティションを設定 (SPLIT) することができない  この状態になった場合、データを追加するためには一度カラムストアイ ンデックスを削除する必要がある 37 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 38. 推奨されるパーティション  スイッチ前は常に以下のようなパーティションにな るようにする ファイル ファイル ファイル ファイル ファイル テーブル グループ 1 グループ 2 グループ 3 グループ 4 グループ 5 アーカイブ テーブル トランザクション テーブル 38 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 39. パーティション利用時の流れ 【スタート】 カラムストアインデックスのテーブルに空きのパーティションが 1 つ用意された状態 パーティションを SPLIT し、空きのパーティションを 2 つ用意する トランザクションテーブルにカラムストアインデックスを追加する トランザクションテーブルのパーティションをスイッチする トランザクションテーブルのカラムストアインデックスを削除 チェック制約で次にスイッチするパーティションのデータのみが格納されるようにする 39 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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 SQLTO 第 4 回勉強会 2012/02/25 http://www.sqlto.net
  • 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