我将对 SQL Server 数据库运行一些查询,然后进行删除。理想情况下,所有这些都发生在一个事务中(即原子事务)。
但实际上,由于数据早已从缓冲区中清除,SQL Server 将不得不执行大量物理 IO 才能完成事务处理的 T-SQL。这可能是个问题,因为如果整个批处理运行时间超过 30 秒,那么用户将遇到超时问题。
我注意到,如果我分段运行我select
的 s,每次运行越来越多的最终 SQL,让 SQL Server 用越来越多的所需数据填充缓冲区。例如:
第一次运行:
BEGIN TRANSACTION
SELECT ... WHERE ...
ROLLBACK
第二次运行:
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
整个批次运行速度很快,因为缓冲区是预先填充的。
是否有一种 SQL Server 模式(即SET NOEXEC ON
)会导致 SQL Server 不执行任何实际的数据修改,不使用任何锁,而是用所需的数据填充缓冲区?例如
SET NOEXEC ON
EXECUTE ThatThingYouDo
SET NOEXEC OFF
EXECUTE ThatThingYouDo
或者
SET DRYRUN ON
EXECUTE ThatThingYouDo
SET DRYRUN OFF
EXECUTE ThatThingYouDo