次の方法で共有


SQL Server Native Client でのコマンドの準備

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

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

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

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

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

コマンドによっては、準備してはいけないものがあります。 たとえば、ストアド プロシージャの実行を指定するコマンドや、SQL Server ストアド プロシージャの作成に関して無効なテキストを含むコマンドは、準備しないようにしてください。

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

一時ストアド プロシージャの作成は、SQL Server Native Client OLE DB プロバイダー固有の初期化プロパティ SSPROP_INIT_USEPROCFORPREPによって制御されます。 プロパティ値がSSPROPVAL_USEPROCFORPREP_ONまたはSSPROPVAL_USEPROCFORPREP_ON_DROPの場合、SQL Server Native Client OLE DB プロバイダーは、コマンドの準備時にストアド プロシージャの作成を試みます。 ストアド プロシージャの作成は、アプリケーション ユーザーが適切な SQL Server 権限を所持している場合に成功します。

ほとんど切断しないコンシューマーの場合、一時ストアド プロシージャの作成には、tempdb の大量のリソースが必要になることがあります。tempdb は、一時オブジェクトが作成される SQL Server システム データベースです。 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 を使用して、コマンド テキストが必要なくなったことを指定したとき。

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

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

参照

コマンド