【问题标题】:Inserting big BLOB takes long time插入大 BLOB 需要很长时间
【发布时间】:2016-08-13 09:50:34
【问题描述】:

我正在构建一个复杂的应用程序。该应用程序的一部分是在其他服务器上运行并将数据发送到 Web 服务 (ASP MVC)-> JSON 的代理。 在控制器中,我将数据转换为 XML 并调用将其存储在表中的存储过程。 SQL 代理作业获取数据并对某些表执行必要的创建、更新和删除操作。

到目前为止一切都很好......

这里的问题是速度。生成的 XML 具有多个 MB 的大小。目前它的〜16MB。将 XML 字符串插入新的数据库行需要 5-6 秒。

我尝试了什么:

  • 将 DB 列更改为 XML。结果一样!
  • 我认为问题出在实体框架上。我用存储过程替换了该代码。结果一样!
  • 从 SP -> 空存储过程中删除了所有语句。结果一样!
  • 将参数类型从 string/nvarchar(max) 更改为 byte[]/varbinary(max)。这带来了一些改善。现在速度快了 50%。但仍然很慢。

似乎将这么大的字符串或字节数组传递给 SQL 服务器需要很长时间!

我能做些什么来加快速度?

我想到了以下几点: - 将数据放在文件系统上并指示 SQL 服务器使用 SELECT FROM OPENROWSET 处理它。

还有其他选择吗?

【问题讨论】:

  • 表的定义是什么?您是存储为文本还是使用 SQL Server 的 XML 支持来解析它?
  • 您可以将数据存储在磁盘上,并在数据库中拥有文件指针/路径。在大多数情况下,这是一种更好的方法。它使您的数据库更小,碎片更少,性能更好,更容易持久地对数据进行更改。我确信有文章介绍了将(更大的)blob 保留在数据库之外的优点。
  • 您可能会对此感兴趣:Programmers Stackexchange - Is it a bad practice to store large files in a database? 特别是关于FILESTREAM 的第二个答案,如果您想继续前进的话。
  • @Igor 同意。这意味着服务器必须同时托管 Web 和 SQL 服务器。我还考虑过使用 TransactionScope 和 NTFS 事务功能在事务中包含文件系统上的存储。
  • @Igor 是的,我做到了。它有点快。我想我会采用我之前解释的方法:TransactionScope 和 Win32 文件功能的事务版本,如“CreateFileTransacted”等......这让我也有快速的文件 I/O 和一致性

标签: .net sql-server blob sqlcommand


【解决方案1】:

尝试异步运行 SQL 操作。我希望你不需要立竿见影的结果。

Threading.ThreadPool.QueueUserWorkItem(new Threading.WaitCallback(InsertBLOB), MyBLOB);

这种方法的缺点是您不会在运行时收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2017-12-05
    • 2014-02-22
    • 2012-07-17
    • 1970-01-01
    • 2019-11-20
    • 2011-06-06
    • 2017-03-08
    相关资源
    最近更新 更多