直接実行
直接実行はステートメントを実行する最も基本的な方法です。SQLExecDirect 関数を使用して直接実行を行うために、アプリケーションでは、Transact-SQL ステートメントを含む文字列を構築し、この文字列を送信します。ステートメントがサーバーに到達すると、SQL Server がステートメントを実行プランにコンパイルしてから、すぐにその実行プランを実行します。
直接実行は、通常、実行時にステートメントを構築して実行するアプリケーションで使用され、1 回だけステートメントを実行する場合には最も効率的な方法です。多くのデータベースでの直接実行の欠点は、SQL ステートメントを実行するたびに解析とコンパイルが必要なことで、ステートメントを複数回実行する場合はオーバーヘッドが増加します。
SQL Server 7.0 より前のバージョンの SQL Server に接続しているときは、次の場合に直接実行を使用する必要があります。
ステートメントが 4 回未満程度しか実行されないとき
ストアド プロシージャを呼び出すとき
SQL Server 2000 以降では、マルチユーザー環境で通常実行されるステートメントに関して、直接実行のパフォーマンスが大幅に向上します。また、通常、SQL ステートメントの実行にパラメータ マーカーを指定して SQLExecDirect を使用すると、準備実行に近い効率を得ることができます。
SQL Server インスタンスに接続しているときは、SQL Server Native Client ODBC ドライバは sp_executesql を使用して SQLExecDirect で指定された SQL ステートメントまたはバッチを送信します。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 では、必要な場合に実行プランを再利用することができます。