SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

DBCC PAGE で Columnstore インデックスを覗いてみる

leave a comment

Denali CTP3 では Columnstore インデックスを使用することが可能となっています。

Columnstore インデックスについては Tech Ed NA 2011 の Columnstore Indexes Unveiled で解説されています。

image

Columnstore インデックスは PowerPivot で使われている VeritiPaq を使用した圧縮を使用して、ページに一つの列のデータを格納する方式になります。

  • 一つのテーブルに一つの Columnstore インデックスしか設定できない
    image
  • 非クラスター化インデックスのみ作成可能
  • 設定できる型に制限がある (クラスター化インデックスの型も考慮する必要がありそうでした)
    image
  • Columnstore インデックスを設定したテーブルは更新できない
    image

というような制限があるため、読み取り専用のテーブルで使用する必要があるのですが情報をざっと見た感じだとかなりうまく利用するとかなり効率よく情報が検索できるようです。

設定をすると検索の条件によっては [Columnstore インデックス~] 系のプランが使用されるようになります。
image

今回の投稿では、この [Columnstore インデックス] を [DBCC PAGE] を使って覗いてみようと思います。

■DBCC PAGE で Columnstore インデックスを覗いてみる


今回は以下のような Columnstore インデックスを作成しています。
image

この Columnstore インデックスがどのようにページに格納されているかを調べてみたいと思います。

DBCC PAGE でページ情報を調べるためにはまずは、対象のインデックスでどのページが使用されているかを確認する必要があります。

そこで、DBCC IND を使用して対象のインデックスで使用されているページ番号を特定したいと思います。

まずは Columnstore インデックスのインデックス番号を調べます。
image

今回は [NonClusteredColumnStoreIndex ~] が Columnstore インデックスとなります。
index_id = 2 が該当のインデックスということが確認できますね。

それではこのインデックス番号を使用して DBCC IND を実行してみます。
image

PageType = 10 は IAM (Index Allocation Map) になります。
PageType = 3 は IndexPage になります。

今回のインデックスでは、PageID 410 が IAM 、409,248~262 が IndexPage として使用されていることが確認できます。
Columnstore インデックスの場合はすべてのインデックスに関するページが LOB として格納されているようですね。

同様の列で作成した非クラスター化インデックスの情報を取得した場合は以下のようになります。
image

このあたりのデータから、通常のインデックスとは異なる格納が行われていることが確認できますね。
クラスター化インデックス/非クラスター化インデックスではNextPagePID / PrevPagePID により各ページのリンクがされていますが、Columnstore インデックスではこれらは使用されておらずページ間は独自のリンクが使われているようです。
また、ページ数も非クラスター化インデックスと比較すると小さくなっています。

それでは DBCC PAGE を使用して Columnstore インデックスのインデックスページを覗いてみようと思います。
まずはページ ID 409 を覗いてみます。
image

このページにはデータが入っていないようですね。

続いてページ ID 248 を除いてみます。
image
image

このページからデータが格納されているようです。
Char 型のデータを格納しているのですがデータがそのまま登録されるのではなく、何かしら圧縮をして登録されているようですね。

各列が異なるページに格納されているのかなと思っていたのですがそういうわけでもなく、ページ内のスロットに各列のデータが格納されるというような動きになるようです。
# データの量によって変わってくるのと、DBCC PAGE の結果なので実際の格納方式と差があるかもしれませんが。
以下のようなデータを登録したとします。
image

Col2 ~ Col4 で Columnstore インデックスを作成しています。
image

Columnstore インデックスは列単位で一つのまとまりとなるインデックスとなります。
そのため、以下のように枠を付けた単位でデータが格納される方法になるはずです。
image

DBCC PAGE を使ってページのデータを直接見てみます。

[Col2]
image

[Col3]
image

[Col4]
image

ページ内ではなくオフセット内 (ページ内の行データ) に各列のデータが格納されているように見えますね。
少量のデータだと上記の画像のようにオフセット内のデータが割ときれいに見えたりします。
# データが増えると圧縮されるからだと思うのですが、上記のように視覚的にわかるデータではなくなります。

Columnstore インデックスで選択した列だけが含まれるのかと思ったのですが、非クラスター化インデックスと同様にクラスター化インデックスの列も Columnstore インデックスには含まれているようです。
image

使い方をこれから考える必要がありますが、まずは DBCC PAGE で Columnstore インデックスを除いてみたらどうなのだろうと興味津々だったので調べてみました。

Share

Written by Masayuki.Ozawa

7月 18th, 2011 at 10:48 pm

Posted in SQL Server

Tagged with , ,

Leave a Reply