SE の雑記

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

Columnstore インデックス作成時のワークスペースメモリの確保について

leave a comment

Columnstore インデックスを作成する際にはワークスペースメモリが確保されるようです。

このメモリ領域から必要となるサイズが確保できない場合、エラー 8657 が発生します。

今回はこの時の動作についてみていきたいと思います。

■default ワークロードグループによる制限


今回、SQL Server には 4GB のメモリを設定しています。
image

この状態で PersonalInfo テーブルに Columnstore インデックスを作成してみます。
image

今回は 3,700 万レコード、1GB のテーブルに Columnstore インデックスを作成しようとしているのですが、以下のエラーが発生して、作成することができませんでした。
image

メッセージ 8657 に関してはリソースガバナーの制限で、クエリ実行時に必要となるワークスペースメモリ (一時領域) が確保できなかったために発生しています。

SQL Server 2008 以降で実装されたリソースガバナーですが、ワークロードが設定されていない場合に割り振られる [default] のワークロードグループでは利用可能なメモリが以下のように制限されています。

image

default のワークロードグループにはデフォルトで 25% のメモリ許可の割合が設定されています。

そのため、今回の環境では [sys.dm_exec_query_resource_semaphores] の [max_target_memory_kb] が [3045888] となっているため、

3,045,888 × 25% = 761,472 KB

が default ワークロードグループに割り当てられたクエリで、ワークスペースメモリとして使用できることになります。

Columnstore インデックスを作成するためには、1GB 程のメモリが必要になりますので 760MB では足りていないですね。

そこで、default のワークロードグループのメモリ許可の割合を以下のように変更してみます。
image

3,045,888 × 35% = 1,066,060.8 KB

になりますのでこれならワークスペースメモリが足りそうですね。

それでは再度 Columnstore インデックスを作成してみたいと思います。

この設定であれば正常に作成が完了します。
image

 

この時のリソースプールのメモリの使用状況がこちらになります。
image

default のワークロードグループで 1.4 GB のワークスペースメモリが確保されているのが確認できますね。

この時の SQL Server のメモリの使用状況がこちらになります。
image

Database Cache (データキャッシュ) と Workspace Memory (ワークスペースメモリ) で 3.8 GB 近くのメモリ (サーバーの大半のメモリ) が取得されているのが確認できます。

Columnstore インデックス作成時にはワークスペースメモリがかなり確保されるようなので、使用する場合のメモリのサイジングは重要になってきそうですね。

今回は default のワークロードグループのメモリ割り当てを直接変更しましたが、Columnstore インデックス作成用のワークロードグループを作成して制御するのが良いかと思います。
Columnstore インデックスの作成中はワークスペースメモリがかなり確保されてしまいますので、他のクエリでワークスペースメモリの確保待ちが発生しないようなサイズを指定しないと作成時の多処理への影響が発生するかもしれないですね。

 

今回書いた、リソースガバナーの機能は Enterprise Edition 以上でないと使用できないため、この方法は Standard Edition 等では使用できません。
そのため、リソースガバナーが使用できないエディションでは 25% の上限は緩和できないかと思います。
Standard Edition 等を使用し、Columnstore インデックスを作成する場合には搭載メモリは注意する必要があるかもしれないですね。
# 現在は Enterprise Evaluation でしか確認できていないため、リソースガバナーが搭載されていない Edition で同じ動作になるのかは未確認なのですが。

Share

Written by Masayuki.Ozawa

10月 19th, 2011 at 8:31 am

Posted in SQL Server

Tagged with ,

Leave a Reply