次の方法で共有


コマンドの準備

SQL Server Native Client OLE DB プロバイダーは、1 つのコマンドの複数の実行を最適化するためのコマンド準備をサポートしています。ただし、コマンドの準備ではオーバーヘッドが発生し、コンシューマーは複数回実行するコマンドを準備する必要はありません。 一般に、3 回以上実行される場合は、コマンドを準備する必要があります。

パフォーマンス上の理由から、コマンドの準備はコマンドが実行されるまで延期されます。 これが既定の動作です。 準備中のコマンドのエラーは、コマンドが実行されるか、メタプロパティ操作が実行されるまで認識されません。 SQL Server プロパティのSSPROP_DEFERPREPAREを FALSE に設定すると、この既定の動作を無効にすることができます。

SQL Server では、コマンドを (最初に準備せずに) 直接実行すると、実行プランが作成されてキャッシュされます。 SQL ステートメントが再度実行された場合、SQL Server には、新しいステートメントをキャッシュ内の既存の実行プランと照合する効率的なアルゴリズムがあり、そのステートメントの実行プランが再利用されます。

準備済みコマンドの場合、SQL Server では、コマンド ステートメントを準備および実行するためのネイティブ サポートが提供されます。 ステートメントを準備すると、SQL Server によって実行プランが作成され、キャッシュされ、この実行プランへのハンドルがプロバイダーに返されます。 その後、プロバイダーはこのハンドルを使用してステートメントを繰り返し実行します。 ストアド プロシージャは作成されません。 ハンドルは、ステートメントをキャッシュ内の実行プランと照合する代わりに SQL ステートメントの実行プランを直接識別するため (直接実行の場合と同様)、ステートメントが複数回実行されることがわかっている場合は、直接実行するよりもステートメントを準備する方が効率的です。

SQL Server 2005 では、準備されたステートメントを使用して一時オブジェクトを作成することはできません。また、一時テーブルなどの一時オブジェクトを作成するシステム ストアド プロシージャを参照することもできません。 これらのプロシージャは、直接実行する必要があります。

一部のコマンドは準備しないでください。 たとえば、ストアド プロシージャの実行を指定するコマンドや、SQL Server ストアド プロシージャの作成に無効なテキストを含めるコマンドは準備しないでください。

一時ストアド プロシージャが作成されると、SQL Server Native Client OLE DB プロバイダーによって一時ストアド プロシージャが実行され、ステートメント自体が実行されたかのように結果が返されます。

一時的なストアド プロシージャの作成は、初期化プロパティ SSPROP_INIT_USEPROCFORPREP -specific SQL Server Native Client OLE DB プロバイダーによって制御されます。 プロパティ値がSSPROPVAL_USEPROCFORPREP_ONまたはSSPROPVAL_USEPROCFORPREP_ON_DROPの場合、SQL Server Native Client OLE DB プロバイダーは、コマンドの準備時にストアド プロシージャの作成を試みます。 アプリケーション ユーザーに十分な SQL Server アクセス許可がある場合、ストアド プロシージャの作成は成功します。

一時的なストアド プロシージャを作成するコンシューマーの場合、一時ストアド プロシージャの作成には、一時オブジェクトが作成される SQL Server システム データベースである tempdb の重要なリソースが必要になる場合があります。 SSPROP_INIT_USEPROCFORPREPの値が SSPROPVAL_USEPROCFORPREP_ ON の場合、SQL Server Native Client OLE DB プロバイダーによって作成された一時ストアド プロシージャは、コマンドを作成したセッションが SQL Server のインスタンスへの接続を失った場合にのみ削除されます。 その接続がデータ ソースの初期化時に作成された既定の接続である場合、一時ストアド プロシージャは、データ ソースが初期化されていない場合にのみ削除されます。

SSPROP_INIT_USEPROCFORPREPの値がSSPROPVAL_USEPROCFORPREP_ON_DROPされると、次のいずれかが発生すると、SQL Server Native Client OLE DB プロバイダーの一時ストアド プロシージャが削除されます。

  • コンシューマーは 、ICommandText::SetCommandText を使用して新しいコマンドを示します。

  • コンシューマーは ICommandPrepare::Unprepare を使用して、コマンド テキストが不要であることを示します。

  • コンシューマーは、一時ストアド プロシージャを使用して、コマンド オブジェクトへのすべての参照を解放します。

コマンド オブジェクトには、 tempdb に最大 1 つの一時ストアド プロシージャがあります。 既存の一時ストアド プロシージャは、特定のコマンド オブジェクトの現在のコマンド テキストを表します。

こちらもご覧ください

コマンド