次の方法で共有


直接実行

直接実行はステートメントを実行する最も基本的な方法です。 アプリケーションは、Transact-SQL ステートメントを含む文字列を作成し、 SQLExecDirect 関数を使用して実行用に送信します。 ステートメントがサーバーに到達すると、SQL Serverはそれを実行プランにコンパイルし、すぐに実行プランを実行します。

直接実行は、通常、実行時にステートメントを構築して実行するアプリケーションで使用され、1 回だけステートメントを実行する場合には最も効率的な方法です。 多くのデータベースでの直接実行の欠点は、SQL ステートメントを実行するたびに解析とコンパイルが必要なことで、ステートメントを複数回実行する場合はオーバーヘッドが増加します。

SQL Server、マルチユーザー環境で一般的に実行されるステートメントの直接実行のパフォーマンスが大幅に向上し、一般的に実行される SQL ステートメントにパラメーター マーカーを指定して SQLExecDirect を使用すると、準備された実行の効率に近づく可能性があります。

SQL Serverのインスタンスに接続すると、SQL Server Native Client ODBC ドライバーは sqlExecDirect で指定された SQL ステートメントまたはバッチを送信するためにsp_executesqlを使用します。 SQL Serverには、sp_executesql で実行された SQL ステートメントまたはバッチが、メモリに既に存在する実行プランを生成したステートメントまたはバッチと一致するかどうかを迅速に判断するロジックがあります。 一致した場合、SQL Serverは新しいプランをコンパイルするのではなく、既存のプランを再利用するだけです。 つまり、多くのユーザーを持つシステムで SQLExecDirect を使用して実行される一般的な SQL ステートメントは、以前のバージョンのSQL Serverのストアド プロシージャでのみ使用できるプラン再利用の利点の多くを利用できます。

実行プランを再利用することで得られる利点は、複数のユーザーが同じ SQL ステートメントやバッチを実行しているときにのみ効果があります。 異なるクライアントが実行する SQL ステートメントを可能な限り統一の取れたステートメントにして、実行プランの再利用を可能にするために、次のコーディング規則に従ってください。

  • SQL ステートメントには定数データを含めません。代わりにプログラム変数にバインドされるパラメーター マーカーを使用します。 詳細については、「 ステートメント パラメーターの使用」を参照してください。

  • 完全修飾オブジェクト名を使用します。 実行プランは、オブジェクト名が修飾されていないと再利用されません。

  • アプリケーション接続では、できる限り、接続オプションとステートメント オプションの共通のセットを使用します。 あるオプションのセット (ANSI_NULLS など) を使用する接続に対して生成される実行プランは、別のオプションのセットを使用する接続には再利用されません。 SQL Server Native Client ODBC ドライバーとSQL Server Native Client OLE DB プロバイダーの両方に、これらのオプションに対して同じ既定の設定があります。

SQLExecDirect で実行されるすべてのステートメントがこれらの規則を使用してコーディングされている場合、SQL Serverは機会が発生したときに実行プランを再利用できます。

参照

ステートメントの実行 (ODBC)