大数据块如何影响SQL删除性能,以及如何减轻影响?

我目前正在经历一个奇怪的问题,就是我对SQL Server的理解不太理解。 我们使用SQL作为我们的内部存储服务的文件存储,而我们的数据库中有大约50万行。 大多数文件(86%)是1MB或者以下,但是即使在我们的数据库的新副本中,我们只是用testing目的的数据填充表格,看起来具有大量数据存储在BLOB中的行频繁当我们的SQL Server处于加载状态时会导致超时。

我对SQL Server如何删除行的理解是,它是一个垃圾收集过程,即该行被标记为ghost,并且在更改复制到事务日志之后,该行将被ghost清除过程删除。 这表明,无论数据块的大小如何,行删除都应该接近即时。 但是,当删除这些行时,我们肯定会遇到大量的超时和惊人的低性能

在我们的testing数据集中,超过30mb的文件导致了这个问题。 这是一个边缘情况,我们并不经常遇到这些情况,尽pipe我们正在研究SQL文件stream作为解决我们的一些问题的方法,但我们正试图缩小这些问题的起因。

我们正在执行我们在一个交易中的删除。 我们也在执行文件大小统计等元数据的更新,但是这些更新存在于远离文件数据本身的单独表格中。 层次结构数据存储在包含文件信息的表中。

实际上,最后并不是我们在重要的删除操作上做了什么,在BLOB中包含大量数据的行上我们找不到任何对低删除性能的引用。 我们正在试图确定这是否是一个值得探索的途径,或者如果它必须成为我们的一个关于删除问题的stream程。

有没有可能发生这种情况? 数据库服务器在很多这样的删除操作同时发生时,是否会发生完全超时? 有没有办法解决这个问题,如果存在?

( 从StackOverflow交叉发布 )

你能定义一个“超时”吗? 命令需要多长时间才能完成?

SQL Server将删除logging到事务日志中,然后当数据库检查点删除实际上从数据文件中删除。 当您运行删除时,页面被加载到内存中(如果它们不在那里)并且删除被写入事务日志。

当你从表中删除数据时,你想一次删除多less条logging?

有没有外键引用这个表,或者表本身是否有外键? 我已经看到,如果在列上没有索引的外键,删除性能会下降,特别是当你有很多行时。

也许尝试在执行删除时包括执行计划,并查看是否有任何意外的步骤(例如表扫描)发生。 当你有一个活动的被阻止的请求,特别是wait_type,wait_time和wait_resource列时,还要检查sys.dm_exec_requests DMV。