SQL Server“Dry Run”模式?加载数据缓冲区,无需保持锁定或更改数据

时间:2010-03-03 19:54:15

标签: sql-server sql-server-2000 buffering sql-server-performance

我要对SQL Server数据库运行一些查询,然后删除。理想情况下,所有这些都发生在事务中(即原子)。

但实际上,由于数据早已从缓冲区中清除,因此SQL Server必须执行大量物理IO才能完成事务处理的T-SQL。这可能是一个问题,因为如果整个批处理运行时间超过30秒,那么用户将遇到超时问题。

我注意到如果我将select分段运行,每次运行越来越多的最终SQL,让SQL Server用越来越多的所需数据填充缓冲区。 e.g:

首次

 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不执行任何实际的数据修改,不采取任何锁定,而是用所需的数据填充缓冲区? e.g。

SET NOEXEC ON
EXECUTE ThatThingYouDo

SET NOEXEC OFF
EXECUTE ThatThingYouDo

SET DRYRUN ON
EXECUTE ThatThingYouDo

SET DRYRUN OFF
EXECUTE ThatThingYouDo

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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