我要去运行针对SQL Server数据库的一些查询,随后删除。理想的情况是所有这发生一个事务(即原子)的内部。

但实际上,因为数据已经因为从缓冲区被清除长,SQL Server将不得不为了完成成交的T-SQL执行大量的物理IO的。这可能是一个问题,因为如果整个批次的时间超过30秒的运行,那么用户将体验到超时的问题。

我注意到,如果我在片运行我selects,每次运行越来越多的最终的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

和由时刻i达到在最终运行

BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT

在整个批次运行速度快,由于缓冲器预填充。

是否有SQL服务器(即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
有帮助吗?

解决方案

没有。结果 比方说,你有插入物,随后在插入的行上的更新。你永远无法效仿的更新,因为不存在插入的行。现在,在这种情况下,为什么你在交易选择?默认情况下(即,除非使用HOLDLOCK或类似的),您没有锁定的行的事务的持续时间。

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

其他提示

我发现,只要你尝试做一些非常出正常的解决一个问题,你的基本设计是最有可能的问题。这是非常出正常的。

也许你可以提供更多的信息的DELETE(表的大小,活性,索引,要删除的行,其他进程运行,等等),其被这么长时间和会有一个常规的解决方案,使用索引或锁定等解决这一问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top