松本美穂と松本崇博が執筆した SQL Server 2012 自習書シリーズの「新機能編 No.3 DWH 関連の新機能」の HTML 版です。 日本マイクロソフトさんの Web サイトで Word または PDF 形式でダウンロードできますが、今回、HTML 版として公開する許可をいただきましたので、ここに掲載いたします。[2014年12月26日]
列ストア インデックスの作成方法は、非常に簡単です。Management Studio を利用する場合は、次のように[インデックス]フォルダーを右クリックして[新しいインデックス]の[非クラスター化 Columnstore インデックス]をクリックします。
[新しいインデックス]ダイアログが表示されたら、次のように[追加]ボタンをクリックします。
["テーブル名" から列を選択]ダイアログが表示されるので、列ストア インデックスに含めたい列を選択して、[OK]ボタンをクリックします。
[新しいインデックス]ダイアログへ戻ったら、[OK]ボタンをクリックします。
以上の操作だけで列ストア インデックスの作成が完了です。
CREATE INDEX ステートメントを利用して作成したい場合にも、次のように COLUMNSTORE キーワードを追加するだけで列ストア インデックスを作成することができます。
従来の非クラスター化インデックスを作成するときと同様、列名には、インデックスに含めたい列をカンマ区切りで指定するだけです。
なお、[新しいインデックス]ダイアログでは、次のように[スクリプト]ボタンをクリックすれば、GUI で操作したものをスクリプト化(CREATE INDEX を生成)することも可能です。
それでは、列ストア インデックスを試してみましょう。
1.まずは、列ストア インデックスをテストするためのデータベースを作成するために、次のように CREATE DATABASE ステートメントを実行します。
データベース名は「CSItestDB」として、データ ファイル(.mdf)は 5GB、ログ ファイル(.ldf)は 300MB で作成しています。データベースの作成先には「C:\CSItest」フォルダーを指定していますが、このフォルダーは任意のパスへ変更してください。
2.次に、データベース内にテーブル「t1」を作成して、1,000万件のデータを追加します
1,000万件のデータを追加しているので、環境にもよりますが、実行には 30分~2時間くらいの時間がかかります(ディスクが低速な場合には、さらに実行時間が長くなります)。
3.データの追加が完了したら、次のように SELECT ステートメントを実行して、追加されたデータを確認しておきましょう。
t1 テーブルには a列(IDENTITY による連番)、b列、c列(現在時刻のミリ秒の部分を抜き出したものを格納 07:55.333(7分55.333秒)なら 333 の部分を格納)を用意して、WHILE ループで 1,000万回 INSERT ステートメントを実行しています。b列には、10,000件ごとに、10,000、20,000、30,000 という値が入るようにしています。
4.次に、COUNT関数を利用して、データ件数が1,000万件であることを確認しておきましょう。
次に、列ストア インデックスを作成してみましょう。
1.ここでは、次のように a列、b列、c列を含めた列ストア インデックスを「cidx1」という名前で作成します。
「コマンドは正常に完了しました」と表示されれば、列ストア インデックスの作成が完了です。
2.次に、b 列に対して DISTINCT キーワードを付けて SELECT ステートメントを実行してみましょう。このとき、ツールバーの[実際の実行プランを含める]をクリックして、クエリ実行後に実行プラン(実行計画)を表示するようにします。
b 列の重複値を除いた結果を取得できていることを確認できます。確認後、次のように[実行プラン]タブをクリックして、実行プランを確認します。
一番右に「Columnstore インデックス スキャン t1.cidx1」があることを確認できます。このアイコンは、列ストア インデックスがスキャンされたときに表示されるものです。
3.次に、クエリ ヒントとして「WITH(INDEX=0)」を付けて、全件スキャンをするように明示指定して(インデックスを利用しないようにして)、同じクエリを実行してみます。
今度は、一番右に「Clustered Index Scan」と表示されて、クラスター化インデックスの全件スキャン(=テーブルの全スキャンと同等)が実行されていることを確認できます。
次に、SET STATISTICS コマンドを利用して、クエリ実行時の IO 数や CPU 時間、実行時間などを比較してみましょう。
1.次のように SET STATISTICS コマンドで IO ON、TIME ON を実行して、前述のクエリを実行します(列ストア インデックスに関しては、クエリヒントで「WITH INDEX=cidx1」を付けて、確実に列ストア インデックスを利用するように指定して実行します)。
このクエリの実行時は、より正確な時間を計測するために、ツールバーの[実際の実行プランを含める]をクリックして、選択状態を外して、実行プランを表示しないようにしておいてください。
2.実行後、[メッセージ]タブを開くと、I/O 数や CPU 時間、実行時間などが表示されることを確認できます。
全件スキャンでは、論理読み取り数(メモリ上のデータ バッファ キャッシュから読み取ったページ数)が 538,063ページ(約4.2GB)、列ストア インデックス利用時は、わずか 80ページ(約0.6MB)であることを確認できます。CPU 時間や実行時間(経過時間)に関しては、ハードウェア環境によって大きく異なりますが、桁違いの性能差が出ていることを確認できると思います(画面は、実行時間は 22倍、CPU 時間は 2000倍もの差が出ています。この結果のハードウェア環境は、Core i7-2600K、16GBメモリを搭載した PC 上の仮想マシンを利用していて、仮想マシン対しては 4コア、8GBメモリを割り当てています)。
なお、ベンチマーク結果の公開は、使用許諾契約書で禁じられていますが、本自習書では特別な許可を得て、実行結果を掲載しています。また、実行結果は、筆者のハードウェア環境に依存するものであり、すべての環境に当てはまるものではないことにこ注意ください。
次に、列ストア インデックスではない通常の非クラスター化インデックスを作成して、列ストア インデックスと比較してみましょう。
1.次のように、非クラスター化インデックスを b列と c列に対して作成してみます。
2.作成後、クエリ ヒントを指定せずに同じクエリを実行して、実行プランを確認します。
非クラスター化インデックスを作成した場合にも、クエリ オプティマイザーによって列ストア インデックスが選択されていることを確認できます。
なお、データ件数が少ない場合(100万件などで試している場合)には、クエリ オプティマイザーが非クラスター化インデックス(idx_bc)を利用したほうが効率的だと判断して、非クラスター化インデックスの Index Scan が実行される場合もあります。
3.次に、クエリ ヒントを利用して、全件スキャンや非クラスター化インデックスを明示指定して、I/O 数や CPU時間、実行時間などを比較してみましょう(このクエリの実行時は、より正確な時間を計測するために、実行プランを表示しないようにしておいてください)。
論理読み取り数は、全件スキャンでは 538,063ページ(約4.2GB)、非クラスター化インデックスでは 26,274ページ(約205MB)、列ストア インデックスでは 80ページ(約0.6MB)であることを確認できます。CPU 時間や実行時間に関しては、ハードウェア環境によっても大きく異なりますが、非クラスター化インデックスを作成することで、全件スキャンよりも速く実行することができるようになっていますが、列ストア インデックスと比べると、桁違いの大きな性能差が出ていることを確認できます。
次に、データ バッファ キャッシュをクリアした場合を比較してみましょう。
1.データ バッファ キャッシュをクリアするには、次のように「DBCC DROPCLEANBUFFERS」を実行します。
データ バッファ キャッシュをクリアしたことで、ディスクからの読み取り(先行読み取り)が発生するため、全件スキャンでの結果が著しく低速になっていることを確認できます(画面では、全件スキャンでの実行時間が 39秒かかっているのに対して、列ストア インデックスではわずか 158ミリ秒で完了していて、その差は 247倍にもなります)。
次に、GROUP BY 演算を行った場合を比較してみましょう。
1.次のように GROUP BY 句に b 列を指定して、b 列でグループ化し、a 列の MAX 値を取得してみます、
論理読み取り数は、全件スキャンでは 538,063ページ(約4.2GB)、非クラスター化インデックスでは 26,274ページ(約205MB)、列ストア インデックスでは 10,091ページ(約78.8MB)であることを確認できます。CPU 時間や実行時間に関しては、ハードウェア環境によって大きく異なりますが、列ストア インデックスでは桁違いの性能が出ていることを確認できます。このように、列ストア インデックスは、GROUP BY 演算や DISTINCT 処理などで大きな効果を発揮する、性能向上に大変役立つ機能です。
第60回:SQL Server 2017 自習書 No.3「SQL Server 2017 Machine Learning Services」のご案内
第59回:SQL Server 2017 自習書 No.2「SQL Server 2017 on Linux」のご案内
第58回:SQL Server 2017 自習書 No.1「SQL Server 2017 新機能の概要」のご案内
第57回:SQL Server 2017 RC 版とこれまでのドキュメントのまとめ
第56回:「SQL Server 2016 への移行とアップグレードの実践」完成&公開!
第55回:書籍「SQL Server 2016の教科書 開発編」(ソシム)が発刊されました
第54回:「SQL Server 2016 プレビュー版 Reporting Services の新機能」自習書のお知らせ
第 53 回:SQL Server 2016 Reporting Services の新しくなったレポート マネージャーとモバイル レポート機能
第 52 回:SQL Server 2016 の自習書を作成しました!
第 51 回:PASS Summit と MVP Summit で進化を確信!
第 50 回:新しくなった Power BI(2.0)の自習書を作成しました!
第49 回:Excel 2016 の Power Query を使う
第 48 回:新しくなった Microsoft Power BI ! 無料版がある!!
第 47 回:「Microsoft Azure SQL Database 入門」 完成&公開!
第 46 回:Microsoft Power BI for Windows app からの Power BI サイト アクセス
第 45 回:Power Query で取得したデータを PowerPivot へ読み込む方法と PowerPivot for Excel 自習書のご紹介
第44回:「SQL Server 2014 への移行とアップグレードの実践」ドキュメントを作成しました
第43回:SQL Server 2014 インメモリ OLTP 機能の上級者向けドキュメントを作成しました
第42回:Power Query プレビュー版 と Power BI for Office 365 へのクエリ保存(共有クエリ)
第41回:「SQL Server 2014 CTP2 インメモリ OLTP 機能の概要」自習書のお知らせです
第40回: SQL Server 2012 自習書(HTML版)を掲載しました
第39回: Power BI for Office 365 プレビュー版は試されましたか?
第38回: SQL Server 2014 CTP2 の公開
第37回: SQL Server 2014 CTP1 の自習書をご覧ください
第36回: SQL Server 2014 CTP1 のクラスター化列ストア インデックスを試す
第35回: SQL Server 2014 CTP1 のインメモリ OLTP の基本操作を試す
第34回: GeoFlow for Excel 2013 のプレビュー版を試す
第33回: iPad と iPhone からの SQL Server 2012 Reporting Servicesのレポート閲覧
第32回: PASS Summit 2012 参加レポート
第31回: SQL Server 2012 Reporting Services 自習書のお知らせ
第30回: SQL Server 2012(RTM 版)の新機能 自習書をご覧ください
第29回: 書籍「SQL Server 2012の教科書 開発編」のお知らせ
第26回: SQL Server 2012 の Power View 機能のご紹介
第25回: SQL Server 2012 の Data Quality Services
第24回: SQL Server 2012 自習書のご案内と初セミナー報告
第23回: Denali CTP1 が公開されました
第22回 チューニングに王道あらず
第21回 Microsoft TechEd 2010 終了しました
第20回 Microsoft TechEd Japan 2010 今年も登壇します
第19回 SQL Server 2008 R2 RTM の 日本語版が公開されました
第18回 「SQL Azure 入門」自習書のご案内
第17回 SQL Server 2008 自習書の追加ドキュメントのお知らせ
第16回 SQL Server 2008 R2 自習書とプレビュー セミナーのお知らせ
第15回 SQL Server 2008 R2 Reporting Services と新刊のお知らせ
第14回 TechEd 2009 のご報告と SQL Server 2008 R2 について
第13回 SQL Server 2008 R2 の CTP 版が公開されました
第12回 MVP Summit 2009 in Seattle へ参加