Sql server SQL Server“干运行”模式?加载数据缓冲区,而不保留锁或更改数据

Sql server SQL Server“干运行”模式?加载数据缓冲区,而不保留锁或更改数据,sql-server,sql-server-2000,buffering,sql-server-performance,Sql Server,Sql Server 2000,Buffering,Sql Server Performance,我将对SQLServer数据库运行一些查询,然后执行删除操作。理想情况下,所有这些都发生在事务内部,即原子事务 但实际上,由于数据早已从缓冲区中清除,SQL Server必须执行大量物理IO才能完成事务处理的T-SQL。这可能是个问题,因为如果整个批处理的运行时间超过30秒,那么用户将遇到超时问题 我注意到,如果我分段运行select,每次都会运行越来越多的最终SQL,让sqlserver用越来越多的所需数据填充缓冲区。e、 g: 首次运行: 第二轮: 第n次运行: 当我到达最后一次跑步时:

我将对SQLServer数据库运行一些查询,然后执行删除操作。理想情况下,所有这些都发生在事务内部,即原子事务

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

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

首次运行:

第二轮:

第n次运行:

当我到达最后一次跑步时:

由于缓冲区是预填充的,所以整个批处理运行得很快

是否存在一种SQL Server模式,即启用NOEXEC会导致SQL Server不执行任何实际数据修改,不执行任何锁定,而是用所需数据填充缓冲区?e、 g

SET NOEXEC ON
EXECUTE ThatThingYouDo

SET NOEXEC OFF
EXECUTE ThatThingYouDo


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

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

否。 假设您在插入行上先插入,然后更新。您将永远无法模拟更新,因为插入的行不存在。现在,在这种情况下,为什么在事务中选择?默认情况下,除非使用HOLDLOCK或类似工具,否则在事务期间不会锁定行


如果您认为缓冲池(也称为数据缓存)已满,则需要更多RAM或其他升级/放大功能。

假设它有1000万行,我将作为书签查找其中的3000行。它实际上是一个分布式事务,跨链接服务器,有20次选择,然后是20次删除。20次选择返回的行数是多少?它们与删除有何关系?换句话说,我正在从OLTP服务器归档数据。想象一下,NSA来到您的银行并说,我们希望您的所有金融交易都分组到存储桶中,其中以每日万事达卡汇率计算的交易值是前50个素数的模。数据库将不得不开始处理旧数据。这是非常不正常的,所以我不打算修改我的数据库结构。您描述的问题不是问题。a新插入的行将在缓冲区b中,我不在乎是否不是最后一行都在缓冲区c中,我不会插入需要填充缓冲区的数据库。虽然我不希望在事务期间保留行,但SQL Server可以在select运行时保留表中部分的锁,例如锁定索引,直到找到匹配的行为止。如果选择时间超过30秒:砰,超时。哦,我不认为缓冲区已满,它们只需要对几GB的数据进行排序。接受为否。如果没有,那就是答案。至少你可以有勇气说出为什么这个问题不清楚。胆小鬼
 BEGIN TRANSACTION
 SELECT ... WHERE ...
 SELECT ... WHERE ...
 ROLLBACK
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
ROLLBACK
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT
SET NOEXEC ON
EXECUTE ThatThingYouDo

SET NOEXEC OFF
EXECUTE ThatThingYouDo
SET DRYRUN ON
EXECUTE ThatThingYouDo

SET DRYRUN OFF
EXECUTE ThatThingYouDo