SQL Serverデータベースに対していくつかのクエリを実行してから、削除します。理想的には、これはすべてトランザクション内(つまりアトミック)で発生します。
ただし、実際には、データがバッファから削除されてから長い時間が経過しているため、SQL Serverは、トランザクションT-SQLを完了するために多くの物理IOを実行する必要があります。バッチ全体の実行に30秒以上かかる場合、ユーザーはタイムアウトの問題を経験するため、これは問題になる可能性があります。
select
を分割して実行すると、最終的なSQLを実行するたびに、SQLServerが必要なデータでバッファをいっぱいにすることに気付きました。例えば:
最初の実行:
BEGIN TRANSACTION
SELECT ... WHERE ...
ROLLBACK
2回目の実行:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
ROLLBACK
..。
n回目の実行:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
ROLLBACK
そして、私が最終的な実行に到達するまでに:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT
バッファが事前に入力されているため、バッチ全体が高速に実行されます。
SET NOEXEC ON
SQL Serverが実際のデータ変更を実行せず、ロックを取得せず、必要なデータでバッファーをいっぱいにするSQL Serverのモード(つまり)はありますか?例えば
SET NOEXEC ON
EXECUTE ThatThingYouDo
SET NOEXEC OFF
EXECUTE ThatThingYouDo
また
SET DRYRUN ON
EXECUTE ThatThingYouDo
SET DRYRUN OFF
EXECUTE ThatThingYouDo