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

44
カラムストアインデックス 最初の一歩 小澤 真之 (@Masayuki_Ozawa) http://engineermemo.wordpress.com

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

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

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

小澤 真之 (@Masayuki_Ozawa)

http://engineermemo.wordpress.com

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

本資料は SQL Server 2012 RC0 をベースに作成しています。 そのため、製品版では動作が変わる可能性があります。 あらかじめご了承ください。 3/7 : SQL Server 2012 Virtual Launch Event http://www.sqlserverlaunch.com/ww/Home

はじめに

2

RC : Release Candidate (製品候補版)

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

3

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

インデックスの種類

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

4

•従来から実装されているインデックス

•行を基本としてデータを格納

行ストアインデックス (Row Store Index)

•SQL Server 2012 Enterprise Edition で使用できるインデックス

•初期は Project “Appolo” と呼ばれていたもの

•PowerPivot で使用されている VertiPack エンジンを採用

•VertiPack は SSAS の Tabular Mode でも使用されている

•列を基本としてデータを格納

カラムストアインデックス (Column Store Index : CSI)

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

5

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

ルートノード

中間ノード

リーフノード

行ストアインデックス

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

6

ID 姓 名 性別

1 井口 拓海 男

2 平岡 頼子 女

3 小畑 美樹 女

4 小宮 喜一郎 男

5 前川 涼子 女

ID

ID ID

ID 姓 名 性別 ID 姓 名 性別 ID 姓 名 性別 ID 姓 名 性別

B-Tree (Balanced Tree) 構造

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

ページ

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

行ストアインデックスの基本構成

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

7

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

Index Allocation Map (IAM)

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

インデックスページ

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

データページ

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

行ストアインデックスの構成

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

8

IAM

インデックス ページ

データページ

In-row data

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

カラムストアインデックス

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

9

ID 姓 名 性別

1 井口 拓海 男

2 平岡 頼子 女

3 小畑 美樹 女

4 小宮 喜一郎 男

5 前川 涼子 女

Columnstore インデックス

ID 1 2 3 4 5

ID

姓 井口 平岡 小畑 小宮 前川

名 拓海 頼子 美樹

喜一郎 涼子

性別 男 女 女 男 女

姓 名 性別

Dictionary

Segment

内部構成

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

Segment

Row Group

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

カラムストアインデックスの基本概念

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

10

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

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

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

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

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

Segment

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

• カラムストアインデックスは列を基本単位としてデータを格納している

が「行」を取得することも可能

Row Group

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

Segment の構成

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

11

各 Segment に含まれる行数は同一になる

Row Group として、同一行のデータを識別するため

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

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

カラムストアインデックスの構成

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

12

Large Object data

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

1,000万件のデータのインデックスサイズ確認

DMV からセグメントの構成を確認

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

13

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

14

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

SELECT 姓, 名 FROM Person

行ストアインデックスのデータ読み取り

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

15

ページ ID ID 姓 名 性別

1

1 井口 拓海 男

2 平岡 頼子 女

3 小畑 美樹 女

2 4 小宮 喜一郎 男

5 前川 涼子 女

I/O の基本はページ

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

データ取得の基本的な実行プランは 4 種類

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

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

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

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

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

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

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

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

行ストアインデックスの実行プラン

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

16

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

SELECT 姓, 名 FROM Person

カラムストアインデックスのデータ読み取り

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

17

Segment Segment Segment Segment

ID 姓 名 性別

RowGroup

1 井口 拓海 男

2 平岡 頼子 女

3 小畑 美樹 女

RowGroup 4 小宮 喜一郎 男

5 前川 涼子 女

I/O の基本はセグメント

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

カラムストアインデックスの実行プラン

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

18

Scan 操作のみ Seek のプランは存在しない。カラムストアインデックスを使

用した場合は、「Columnstore インデックス スキャン」 となる

Scan は対象となるセグメントのみを走査 全セグメント (データの取得対象ではない列) を走査しているわけ

ではない

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

データ取得方法の違い

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

19

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

非クラスター化カラムストアインデックス

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

20

現在のバージョンではカラムストアインデックスは「非クラスター化インデックス」としてのみ作成が可能 SQL Server 2012 のサービスパック またはそれ以降のリリース

ではクラスター化カラムストアインデックスが作成できるようになる予定 (と SQL Server 2012 の書籍に書いてありました)

カラムストアインデックスは 1 テーブルに 1 つのみ作成可能 インデックスビュー / フィルタされたカラムストアインデックス

は作成できない

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

21

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

カラムストアインデックスの制限

2012/02/25 SQLTO 第 4 回勉強会 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 インデックスを設定している場合、テーブルを直接更新することはできない

•パーティショニングと組み合わせてパーティションのスイッチをすることでデータの追加は可能

データの更新

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

使用時のポイント

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

23

データ追加のワークロードについてはパーティショニング必須

パーティションをスイッチしてデータを追加

大量のデータが格納されているファクトテーブル (スタースキーマの中心) またはディメンションテーブル (属性) で使用すると効果的

テーブルを結合するときはハッシュテーブルがメモリ内におさまるようにする (インメモリで操作が完了するメモリのサイジング)

カラムストアインデックス作成時にメモリが不足すると作成できない

必要となる要求メモリ (MB) の概算 = ((4.2 × CSI に含める列数) + 68) × DOP (作成時の CPU の並列度) + (文字型の列数 × 34)

カラムストアインデックスに含める列数がメモリに影響してくる

カラムストアインデックスに対する結合条件は単一の列にする

複数の列で結合をするとレスポンスに影響がでる可能性がある

バッチモードで実行されるようにクエリを記述する

実行プランを確認する

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

カラムストアインデックスを使用しない

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

24

実行するクエリによってはカラムストアインデックスではなく行ストアインデックスを使用したほうが効率の良い場合がある

少量のデータ検索など

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

OPTION (IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX)

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

カラムストアインデックス作成時のメモリ不足

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

25

カラムストアインデックス時にメモリ (Granted Workspace Memory) が確保できないとエラーが発生する。 SQL Server ではリソースガバナーの default リソースプールで

Workspace Memory として確保できるメモリは 25% となっている (メモリ許可の割合) ので注意が必要

カラムストアインデックス作成用のリソースプールを用意

作成時に必要となるメモリは列数に依存するところが大きい int × 1 + char(1) × 1022 のテーブルに 1 レコードのみ挿入してカラムストア

インデックスを作成すると 4.2GB 程度のメモリが必要であった

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

カラムストアインデックスの更新

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

26

カラムストアインデックスを設定したテーブルを更新することはできない

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

27

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

2 種類の実行モード

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

28

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

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

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

実行される

行モード (Row Mode)

• 高度なクエリ実行テクノロジ (Vector モードを使用したバッチプロセ

ス) により、バッチと呼ばれる列のまとまりが効率的に処理され、

CPU 使用率が下がる

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

バッチモード (Batch Mode)

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

ハッシュ結合時の動作の違い (ロードバランス)

行モード バッチモード

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

29

Hash Join Hash Join

Exchange Exchange Exchange Exchange

プローブ入力 (2番目の入力からの読み取り:右入力

ビルド入力 (最初の入力からの読み取り:左入力)

Hast Table (共有)

バッチ1 バッチ2 バッチ

3

バッチn …

バッチ1 バッチ2 バッチ

3

バッチn …

スレッド1

スレッド2

スレッド1

スレッド2

スレッド3 スレッド3

ビルド側 プローブ側

出展元 : Accelerating DWH with Denali Column Stores

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

ハッシュ結合時の実行プランの違い

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

30

行モードのハッシュテーブルの作成

バッチモードのハッシュテーブルの作成

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

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

実行プランで確認

行モード バッチモード

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

31

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

プロパティから確認

行モード バッチモード

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

32

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

並列クエリの必要性

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

33

並列クエリを使用しないとバッチモードで実行されない (ようです)

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

バッチモードの実行プラン

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

34

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

35

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

データ追加のワークロードには対応可能

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

36

データの追加はパーティショニングを使用する パーティションのスイッチをすることでデータを追加す

ることができる。

テーブル ファイル グループ 1

ファイル グループ 2

ファイル グループ 3

ファイル グループ 4

アーカイブ テーブル

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

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

スイッチ時の注意点

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

37

パーティションをスイッチする際には、トランザクションテーブルに対してカラムストアインデックスを作成する必要がある スイッチ元 / スイッチ先ともに同じインデックスが付与されている必要

があるため

スイッチの前に空きパーティションを一つ作成する必要がある パーティションに空きがない状態だと追加のパーティションを設定

(SPLIT) することができない この状態になった場合、データを追加するためには一度カラムストアイ

ンデックスを削除する必要がある

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

推奨されるパーティション

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

38

スイッチ前は常に以下のようなパーティションになるようにする

テーブル ファイル グループ 1

ファイル グループ 2

ファイル グループ 3

ファイル グループ 4

ファイル グループ 5

アーカイブ テーブル

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

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

パーティション利用時の流れ

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

39

トランザクションテーブルのカラムストアインデックスを削除

チェック制約で次にスイッチするパーティションのデータのみが格納されるようにする

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

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

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

【スタート】

カラムストアインデックスのテーブルに空きのパーティションが 1 つ用意された状態

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

UNION を使用して更新系と結合

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

40

カラムストアインデックスが設定されているテーブルと更新系 (トランザクション) テーブルを UNION ALL を使用して結合することで一つの表として見せる

(SELECT * FROM PartitionTable_Archive WHERE 姓 = '小澤') UNION ALL (SELECT * FROM PartitionTable WHERE 姓 = '小澤')

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

パーティションのスイッチを使用したデータの追加

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

41

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

まとめ

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

42

現状のカラムストアインデックスは更新ができないので、OLTP ではなく DWH で使用される機会が多いかと 使用できるデータ型にも制限があるためカラムストアインデックスを使用する場

合はテーブル構造に注意する

将来的には更新にも対応される予定がある http://enterprisezine.jp/dbonline/detail/3690/?p=3

カラムストアインデックスを使用する際は、パーティションとの併用を検討 データの追加を行う場合はパーティション必須

カラムストアインデックスは Enterprise Edition の機能なのでパーティションが使えるエディション

実行プランを確認する 行ストアインデックスのほうが効率が良いクエリとなる可能性の検討

Batch Mode で実行されているかを確認する

メモリサイズに注意する 列数が多いと作成時に要求されるメモリが不足する可能性があるので注意

ハッシュ操作をメモリで完結できるようにする

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

2012/02/25 SQLTO 第 4 回勉強会 http://www.sqlto.net

43

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

参考情報

2012/02/25 SQLTO 第 4 回勉強会 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