【发布时间】:2011-07-01 14:22:09
【问题描述】:
我目前遇到一个奇怪的问题,我对 SQL Server 的理解与此不太相符。我们使用 SQL 作为内部存储服务的文件存储,我们的数据库中有大约 50 万行。大多数文件 (86%) 为 1mb 或以下,但即使在我们数据库的新副本上,我们只是用数据填充表以进行测试,似乎有大量数据的行经常存储在 BLOB 中当我们的 SQL 服务器负载不足时导致超时。我对 SQL Server 如何删除行的理解是它是一个垃圾收集过程,即该行被标记为幽灵,然后在将更改复制到事务日志后,该行被幽灵清理过程删除。这向我表明,无论 blob 中数据的大小如何,行删除都应该接近瞬时。但是,在删除这些行时,我们肯定会遇到大量超时和惊人的低性能。
在我们的测试数据集中,超过 30mb 的文件会导致此问题。这是一个边缘案例,我们不会经常遇到这些问题,尽管我们正在研究 SQL 文件流作为我们某些问题的解决方案,但我们正在尝试缩小这些问题的根源。
我们正在事务内部执行删除操作。我们还对元数据(例如文件大小统计信息)进行更新,但这些更新存在于与文件数据本身不同的单独表中。层次结构数据存储在包含文件信息的表中。
真的,最终我们围绕删除所做的事情并不重要,我们只是找不到任何关于在 BLOB 中包含大量数据的行上删除性能低的参考。我们正在尝试确定这是否是一个值得探索的途径,或者它是否必须是我们围绕导致问题的删除的流程之一。有没有可能发生这种情况的情况?当许多这些删除同时发生时,数据库服务器是否经常出现完全超时?如果存在这个问题,有没有办法解决?
【问题讨论】:
-
我建议将其移至serverfault.com,在那里您可能会发现更多人了解 SQL Server 内部结构。 :)
-
你在这方面有什么收获吗?我认为我们有同样的问题。我们的 Blob 大小为 2 到 20 MB,删除性能非常慢。
标签: sql-server performance timeout