Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » クエリ処理 » クエリの最適化と実行 » オプティマイザの仕組み » オプティマイザの基本となる仮定条件

 

メモリ・ガバナー

SQL Anywhere データベース・サーバはキャッシュ (「バッファ・プール」とも呼ぶ) を使用し、データベース・ページのイメージを一時的に格納 (バッファ) します。これらのページは通常、テーブル・ページとインデックス・ページです。ただし、SQL Anywhere データベースには他の種類の物理ページも格納されます。これらのページに加えて、データベース・サーバは他に 2 つのメモリ・プールのキャッシュを使用します。これらのプールの 1 つは仮想メモリです。接続、文、カーソルを表す構造など、データベース・サーバのデータ構造に使用されます。2 番目のプールは、「クエリ・メモリ」の仮想ストレージとして使用されるキャッシュ・ページで構成されます。

ハッシュ・ジョインやソートなどのクエリ実行アルゴリズムでは、効率良く操作するためにメモリが必要です。SQL Anywhere は「メモリ・ガバナー」を使用して、各文がクエリの実行に使用できるクエリ・メモリの量を決定します。メモリ・ガバナーはクエリ・メモリ・プールを文に割り付け、負荷を効率的に実行できるようにします。データベース・サーバのプロパティ QueryMemPages に、分散に使用できるクエリ・メモリ・プール内のページ数が表示されます。プール・サイズは、サーバの最大キャッシュ・サイズに対する割合 (キャッシュ・サイズの上限) で設定されます。この値は、-ch サーバ・オプションで制御できます。データベース・サーバ・プロパティ QueryMemPercentOfCache で、クエリ・メモリに設定できる最大キャッシュ・サイズの割合を指定します。この割合は 50% です。

メモリ・ガバナーは選択されたページ数を各文に付与し、文はメモリを大量に消費するクエリ処理アルゴリズムにそのページを使用できます。クエリ処理アルゴリズムがページを使用するまでは、引き続きクエリ・メモリ・プール内のメモリを他の目的 (テーブルのバッファリングやインデックス・ページなど) にも使用できます。クエリ・メモリを使用し、メモリを大量に消費するクエリ処理アルゴリズムには、ハッシュ DISTINCT、ハッシュ GROUP BY、ハッシュ・ジョインなどのあらゆるハッシュベースの演算子や、ソート演算子、ウィンドウ演算子があります。

文が実行を開始すると、メモリ・ガバナーはオプティマイザの推定を使用して、文が使用できるメモリ容量を決定します。この推定は、グラフィカルなプランに QueryMemMaxUseful として表示されます。文のクエリ・メモリは、要求のアクセス・プランで使用される、メモリを大量に消費する特定の演算子間で割り付けられます。交換演算子の下にある、メモリを大量に消費する並列演算子はそれぞれ固有のクエリ・メモリの割り付けを受け取ります。単純な要求の場合は、大容量のメモリによる恩恵を受けません。ただし、ハッシュベースの演算子またはソートを使用する要求は、必要なローをすべてメモリ内に保持できるだけのメモリ容量があると処理効率が向上します。

データベース・サーバのマルチプログラミング・レベルが高くなると、同時実行タスクまたは要求が追加されるたびにデータベース・サーバはクエリ・メモリ容量の予約が必要になり、特定の要求に使用できる容量が減ります。さらにメモリ・ガバナーは、メモリを大量に消費する要求の同時実行数を制限します。この最大値は、データベース・サーバを実行するコンピュータのパフォーマンス特性に応じて選択されます。また、この制限は、サーバ・プロパティ QueryMemActiveMax に表示されます。メモリ・ガバナーは、メモリを大量に消費する要求の同時実行数の推定を継続します。この推定はデータベース・サーバ・プロパティおよびパフォーマンス・モニタの統計に使用できます。メモリ・ガバナーはこの実行数の平均を使用して、クエリ・メモリ・プールからのメモリの割り付け量を決定します。メモリを大量に消費する要求の実行数が少ない場合、より多くのメモリが各要求に割り付けられます。実行数が多い場合は、クエリ・メモリをより均等に共有できるように、各要求への割り付けが少なくなります。このとき、各要求で使用できると推定されるクエリ・メモリ・ページ数が考慮されます。

メモリを大量に消費する文の実行を開始したとき、メモリを大量に消費する要求の最大同時実行数にすでに達している場合は、いずれかの実行中の要求が割り付けられたメモリを解放するまで入力された文は待機します。query_mem_timeout データベース・オプションは、入力された要求にメモリが付与されるまで待つ時間を制御します。デフォルト設定 -1 を使用すると、要求はデータベース・サーバで定義された期間待機します。待機後、使用できるメモリが付与されない場合は文のアクセス・プランは少ないメモリ容量で実行されます。これによって実行が遅くなる場合がありますが、プラン内のメモリを大量に消費する物理演算子に対して実行時のメモリ量が少なくなる方式を使用できる場合は、その方式が使用されます。データベース・サーバ・プロパティおよびパフォーマンス・モニタの統計 QueryMemGrantWaiting に、メモリの割り付けを待つ現在の要求数が表示されます。また、QueryMemGrantWaited に、要求しているメモリが付与されるまで待機する必要がある合計回数が表示されます。

グラフィカルなプランの QueryMemNeedsGrant 値には、単純な要求 (メモリの付与が不要) かメモリを大量に消費する (メモリの付与が必要) かをメモリ・ガバナーが検討した結果が表示されます。メモリ・ガバナーによってメモリの付与が不要と分類された要求は、ただちに実行されます。それ以外の場合、要求は一定割合のクエリ・メモリ・プールの使用を求めます。グラフィカルなプランの QueryMemLikelyGrant 値には、要求を実行するために付与されることが予想される推定ページ数が表示されます。

参照