0

ときどき、ストアド プロシージャを実行して、2 つまたは 3 つの異なるテーブルのレコードのうち、いくつかの基準を満たすレコードの数を概算したいと考えています。この見積もり中に新しいレコードが追加、削除、または更新された場合、実際には問題はありません (大まかな見積もりが必要です)。つまり、 を使用してこのプロセスを実行する余裕がありますSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。ただし、これについて 2 つの質問があります。

1) 命令だけを使用しているので、これらのステートメントをブロックSELECT COUNT(*)でラップする必要は本当にありますか?BEGIN/COMMIT TRANSACTION

2)ストアドプロシージャSET TRANSACTION ISOLATION LEVEL READ COMMITTEDの最後に戻る必要がありますか、それとも実行が終了すると自動的に設定されますか?

4

2 に答える 2

0
  1. いいえ。読み取りはトランザクション内にある必要はありません

  2. SET のスコープは、ストアド プロシージャのみです。ここで私の回答を参照してください: 1 つのストアド プロシージャ内から、より低いトランザクション分離レベルを設定する別のストアド プロシージャを呼び出しても大丈夫ですか? . ただし、 SET: ではなく NOLOCK ヒントを使用しますSELECT COUNT(*) FROM myTable WITH (NOLOCK)

WHERE フィルターを使用せずに概数が必要な場合は、sys.dm_db_partition_stats を使用します。ここで私の答えを参照してください:非常に大きなテーブルで正確な行数をカウントする最速の方法は?

于 2011-06-18T10:37:54.377 に答える
0

1) いいえ。トランザクション スコープを指定しない場合、ステートメントごとに暗黙的なトランザクションが使用されます。「トランザクション分離レベルを機能させる」ために、明示的なトランザクション スコープを設定する必要はありません。

2) 元に戻す必要はありません。これは SQL Server によって処理されます。この SO エントリを参照してください: Transaction Isolation Level Scopes

于 2011-06-18T10:43:49.760 に答える