1

我将对 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
4

2 回答 2

1

我发现,每当您尝试做一些非常不正常的事情来解决问题时,您的基本设计很可能就是问题所在。这是非常不正常的。

也许您可以提供有关 DELETE(表大小、活动、索引、要删除的行、正在运行的其他进程等)的更多信息,这需要很长时间,并且会有一个传统的解决方案,使用索引或锁定等来解决它.

于 2010-03-03T20:02:20.467 回答
1

不。
假设您在插入的行上有 INSERT 和 UPDATE 。您将永远无法模拟 UPDATE,因为插入的行不存在。现在,在这种情况下,为什么您的选择在事务中?默认情况下(即除非您使用 HOLDLOCK 或类似方法),您不会在事务期间锁定行。

如果您认为缓冲池(又名数据缓存)“已满”,那么您需要更多 RAM 或其他一些升级/扩展。

于 2010-03-03T20:07:03.610 回答