-1

私はMS Sql Serverの初心者です。SQL Server SP を保守したわずか数か月の経験。SP を最適化するためのトランザクション分離レベルについて読んでいて、かなり混乱しています。以下の質問で私を助けてください:

  1. ClientDB で DBCC useroptions を実行すると、分離レベルの既定値は 'コミットされた読み取り' になります。これは、DB が分離レベルに設定され、 READ_COMMITTED_SNAPSHOT ON に設定されていることを意味しますか?

  2. SET TRANSACTION ISOLATION LEVEL (トランザクション レベル) は SET READ_COMMITTED_SNAPSHOT ON (DB レベル) と同じですか? つまり、DB で SNAPSHOT が有効になっている場合、SP で分離レベルを設定し、それに応じてデータを処理できますか?

  3. ALLOW_SNAPSHOT_ISOLATION は上記と似ていますか?

  4. 非常に長時間実行される SELECT ステートメントで始まる SP があります。このステートメントは、その内容を一時テーブルにダンプします。次に、一時テーブルを使用して、ベース テーブルを UPDATE/INSERT します。約 8 ミルのレコードが選択されて一時テーブルにダンプされ、その後、同様の数の合計行が更新/挿入されます。私たちが直面している問題は、この SP があまりにも多くのディスク領域を占有することです。これはクライアント DB であり、DB のディスク容量/ログ サイズなどを確認する権限がありません。したがって、tempDB/tempDB-log がこのディスク領域を占有しているのか、clientDB/clientDB-log が占有しているのかはわかりません。ただし、ディスク容量は一度に 10GB も減少する可能性があります。これにより、トランザクション ログのディスク領域が不足し (ディスクがいっぱいになるため)、SP エラーが発生します。SNAPSHOT 分離レベルを使用すると、このディスク容量はさらに影響を受けますか? tempDB を使用してデータをバージョン化するのでしょうか。

  5. 私が本当にやりたいことはこれです: トランザクション分離レベルを SNAPSHOT に設定します。次に、一時テーブルに SELECT を実行します。次に、BEGIN TRANSACTION を実行し、たとえば 1 ミルのレコードのベース テーブルを更新/挿入します。すべてのレコードが処理されるまで、ループでこれを行います。その後、トランザクションを終了します。これは良い考えだと思いますか?最初の SELECT を TRANSACTION から除外する必要がありますか? これは、トランザクション ログの負荷を軽減するのに役立ちますか?

4

1 に答える 1