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 ではキャッシュから結果を取り出すだけで済みます。このようにして、SQL Anywhere は、何度も繰り返される冗長な計算を避けます。要求が完了すると (クエリのカーソルが閉じられると)、SQL Anywhere はキャッシュされた値を解放します。

クエリの処理が進むに従って、SQL Anywhere は、キャッシュされたサブクエリの値が再使用された頻度をモニタします。相関変数の値がめったに繰り返されない場合、SQL Anywhere は、ほとんどの値を 1 回しか計算する必要がありません。このような場合、SQL Anywhere は、一度しか発生しない数多くのエントリをキャッシュするよりも、たまに重複する値を再計算する方が効率的であると判断します。そのため、データベース・サーバは文の残りの部分についてこのサブクエリのキャッシュを中断し、外部クエリ・ブロック内のすべてのローに関するサブクエリの再評価を開始します。

従属カラムのサイズが 255 バイトを超える場合も、SQL Anywhere はキャッシュを行いません。その場合、クエリを書き換えるか、または別のカラムをテーブルに追加して、操作をより効率的にします。

関数のキャッシュ

一部の組み込み関数とユーザ定義関数は、サブクエリの結果と同じ方法でキャッシュされます。このため、同じパラメータを使用したクエリの処理中に呼び出される高コストの関数のパフォーマンスが大幅に向上します。ただし、これは関数の呼び出し回数が予想より少なくなることを意味しています。

関数がキャッシュされるためには、2 つの条件を満たす必要があります。

  • 特定のパラメータ・セットに対して常に同じ結果を戻す

  • 基本となるデータに対し副次的な影響を与えない

これらの条件を満たす関数は、「決定性」関数、または「べき等」関数と呼ばれます。SQL Anywhere では、すべてのユーザ定義関数は、NOT DETERMINISTIC と宣言されないかぎり「決定性」として扱われます。つまり、データベース・サーバは、同じパラメータを持つ同じ関数が連続して 2 回呼び出されている場合は、どちらの呼び出しでも同じ結果が返され、クエリの意味に不要な弊害は生じないものと見なします。

組み込み関数は、決定性関数として扱われますが、いくつか例外があります。RAND、NEW_ID、GET_IDENTITY 関数は非決定性関数として扱われ、その結果はキャッシュされません。

ユーザ定義関数の詳細については、CREATE FUNCTION 文 [Web サービス]を参照してください。