FIX: SELECT INTO ステートメントのロック動作

この記事は、以前は次の ID で公開されていました: JP153441
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
概要
SQL Server 6.5 では、SELECT INTO ステートメントは 1 つのトランザクション内で実行されます。SELECT INTO ステートメントを使用して作成されたテーブルは、ACID トランザクション プロパティ (不可分性、一貫性、分離性、持続性) を維持します。これは、SELECT INTO ステートメントの実行中、ページ、エクステント、およびロックなどのシステム リソースが保留されることにもなります。保留されるシステム オブジェクトの規模が大きい場合、内部タスクの多くが、SELECT INTO ステートメントを実行しているユーザーによってブロックされてしまいます。たとえば、使用率の高いサーバーで、多くのユーザーが SQL Enterprise Manager (SEM) ツールを使用してシステムの処理状況をモニターしようとすると、互いの処理をブロックすることになり、SEM アプリケーションが応答していないかのような状況になります。
詳細
SQL Server 6.5 の Service Pack 1 にアップグレードすると、SELECT INTO ステートメントのロック動作をシステム設定で変更することができます。既定の設定では、SELECT INTO ステートメントは 1 つのトランザクション内で実行されます。新しく追加されたトレース フラグを使用すると、システム カタログ ロックを SELECT INTO ステートメントで保留しないように設定できます。トレース フラグを有効にするには、「-T5302」コマンド ライン パラメータを使用してサーバーを起動するか、またはクエリ ウィンドウから次のコマンドを実行してください。
dbcc traceon (3604)godbcc traceon (5302)go

5302 トレース フラグを有効にした状態で SELECT INTO ステートメントが失敗しても、テーブルは作成されます。選択したロック動作は、サーバー上のすべてのデータベースに適用されます。



5302 トレース フラグを有効にしても、SELECT INTO ステートメントが SQL Server 6.5 の明示的トランザクション (BEGIN TRAN など) 内で実行された場合には、システム テーブルはトランザクションが完了するまでロックされます。これは、トレース フラグによって、SELECT INTO を 2 つのオペレーションで同時に実行できるようになっても、ターゲット テーブルの作成はやはり、1 つのトランザクション内の DDL ステートメントによって実行されるためです。

トランザクション内の CREATE TABLE ステートメントは、sysobjects、sysindexes、および syscolumns 上に EX_PAGE ロックを保持します。SQL Server 6.0 では、SELECT INTO ステートメントをユーザー定義の明示的トランザクションの一部として実行することはできません。この処理を実行しようとすると、エラー メッセージ 226 "SELECT INTO command not allowed within multi-statement transaction" が表示されます。

メモ : SQL Server のバージョン 7.0 以降では、この問題は発生しません。
詳細
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 153441(最終更新日 2000-03-22) をもとに作成したものです。

プロパティ

文書番号:153441 - 最終更新日: 02/05/2014 21:25:21 - リビジョン: 3.1

  • Microsoft SQL Server 6.5 Standard Edition
  • kbnosurvey kbarchive kbfix6.50.sp1 kbnetwork ssrvlock ssrvtran_sql kbtshoot KB153441
フィードバック