これまではメモリにかかわるパラメータの中でユーザー自身が設定可能なのは「max server memory」だといってきました。これはもちろん事実ですし、その範囲内でチューニングできれば一番分かりやすいのですが、実は「max server memory」以外の部分でもチューニングできるパラメータがあります。「memory to reserve」がそれです。
「memory to reserve」には「特殊なメモリ予約領域」があると前述しましたが、さらに詳しく説明しましょう。これはメモリプールとは別に、SQL Serverプロセス内にメモリを割り当てられる領域として残す仮想アドレス領域です。
SQL Serverでは8Kbytesを超える大きなクエリ(拡張プロシージャ.dllファイル、分散クエリによって参照されるOLE DBプロバイダ、Transact-SQLステートメントで参照されるオートメーションオブジェクトなど)は「Buffer Cache」の中に置けないため、ここに置かれます。このため非常にサイズの大きなクエリをいくつも投げた場合など、8Kbytesを超えた実行プランが次々に「特殊なメモリ予約領域」を使用することになりますが、このときに割り当てサイズが十分にないと、内部的な待ちが発生して処理の遅延を起こすのです。
SQL Server 2000の「memory to reserve」の既定値は、「ワーカースレッドスタック」と「特殊なメモリ予約領域」を合計した256Mbytesですが、大部分の人は「特殊なメモリ予約領域」の設定方法を知りません。そのために上のような遅延には対処できないと思っている人は、かなりのベテランでも多いはずです。
実はこの「memory to reserve」の「特殊なメモリ予約領域」を変更する方法はあるのです。起動パラメータの中の「-g(ハイフンg)」というスイッチを使ってMbytes単位で指定できます。既定値は以下のとおりです。
大きなクエリを大量に処理するシステムでは、この値を大きくするとパフォーマンス向上が期待できます(図3)。
「memory to reserve」を構成するもう1つのパラメータに「max worker threads」があります。この値はSQL Server 2000では既定値255、SQL Server 2005では起動時にプロセッサ数を元に自動的に計算されますが、私の最近の持論としては、これも運用で実際に使用されるメモリ量を正確に算定し、固定値として設定した方がいいと考えています(詳細は前回を参照してください)。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.