次の方法で共有


ODBC での動的 SQL パフォーマンス

静的 SQL は多くの状況で適切に機能しますが、データ アクセスを事前に特定できないアプリケーションのクラスがあります。 たとえば、スプレッドシートを使用すると、ユーザーはクエリを入力でき、スプレッドシートは DBMS に送信してデータを取得できます。 このクエリの内容は、スプレッドシート プログラムの記述時にプログラマには明らかに認識できません。

動的実行

この問題を解決するために、スプレッドシートは動的 SQL と呼ばれる埋め込み SQL の形式を使用します。 プログラムでハードコーディングされた静的 SQL ステートメントとは異なり、動的 SQL ステートメントは実行時に作成し、文字列ホスト変数に配置できます。 その後、処理のために DBMS に送信されます。 動的 SQL ステートメントの場合、DBMS は実行時にアクセス プランを生成する必要があるため、動的 SQL は一般に静的 SQL よりも遅くなります。 動的 SQL ステートメントを含むプログラムがコンパイルされると、静的 SQL のように、動的 SQL ステートメントはプログラムから削除されません。 代わりに、ステートメントを DBMS に渡す関数呼び出しに置き換えられます。同じプログラム内の静的 SQL ステートメントは、通常どおりに処理されます。

動的 SQL ステートメントを実行する最も簡単な方法は、EXECUTE IMMEDIATE ステートメントを使用することです。 このステートメントは、コンパイルと実行のために SQL ステートメントを DBMS に渡します。

EXECUTE IMMEDIATE ステートメントの欠点の 1 つは、ステートメントが実行されるたびに DBMS が SQL ステートメントを処理する 5 つの手順をそれぞれ実行する必要があることです。 多くのステートメントが動的に実行される場合、このプロセスに伴うオーバーヘッドが大きくなる可能性があり、これらのステートメントが似ている場合は無駄になります。

実行の準備

上記の状況に対処するために、動的 SQL には、準備された実行と呼ばれる最適化された形式の実行が用意されており、次の手順を使用します。

  1. プログラムは、EXECUTE IMMEDIATE ステートメントの場合と同様に、バッファー内に SQL ステートメントを構築します。 ホスト変数の代わりに、ステートメント テキスト内の任意の場所にある定数に疑問符 (?) を置き換えて、定数の値が後で指定されることを示すことができます。 疑問符はパラメーター マーカーとして呼び出されます。

  2. プログラムは PREPARE ステートメントを使用して SQL ステートメントを DBMS に渡します。このステートメントは、DBMS がステートメントを解析、検証、最適化し、そのステートメントの実行プランを生成するように要求します。 その後、プログラムは (EXECUTE IMMEDIATE ステートメントではなく) EXECUTE ステートメントを使用して、後で PREPARE ステートメントを実行します。 ステートメントのパラメーター値は、SQL Data Area または SQLDA と呼ばれる特殊なデータ構造を介して渡されます。

  3. プログラムは EXECUTE ステートメントを繰り返し使用して、動的ステートメントが実行されるたびに異なるパラメーター値を指定できます。

準備された実行は、静的 SQL と同じではありません。 静的 SQL では、SQL ステートメントを処理する最初の 4 つの手順がコンパイル時に行われます。 準備された実行では、これらの手順は実行時に引き続き実行されますが、実行されるのは 1 回だけです。 プランの実行は、EXECUTE が呼び出されたときにのみ行われます。 この動作は、動的 SQL のアーキテクチャに固有のパフォーマンス上の欠点の一部を排除するのに役立ちます。

関連項目

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)