【发布时间】: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