【问题标题】:Inserting large object into SQL Server from C#从 C# 将大对象插入 SQL Server
【发布时间】:2015-04-29 18:35:43
【问题描述】:

我正在尝试将一个大对象插入到单个数据行中。当对象的大小变大时,我会遇到超时。

对象中的一个属性是byte[]。该对象只有几个属性,其余为int

目标表有一个varbinary(max) 类型的列来保存byte[] 属性。插入是通过存储过程完成的,包装在事务中,并使用 ROWLOCK 提示进行插入(此表目前仅在本地存在,因此此时锁定不应该成为问题。)

byte[] 包含最多约 200MB 的数据时,插入工作正常。在那之后,它变得非常丑陋并开始超时(内存可能不是我机器上的问题)。

我已将数据库的设置更改为自动扩展 500MB,并将恢复模式设置为简单。这笔交易应该非常快,但似乎某处存在瓶颈。

对于数据库更改或将大型对象写入varbinary 列的替代方法有什么想法吗?谢谢!

【问题讨论】:

  • 您是否尝试为连接设置适当的timeout 值?
  • @MehrzadChehraz - 超时设置为 45 秒。
  • 而你增加了超时值,命令仍然无法执行?
  • 只是为了测试,我将超时设置为 5 分钟。仍然超时。
  • 200MB 的数据太多,无法在 SQL 中保存。使用正确的超时,它可能会起作用,但从逻辑上讲,它看起来是个坏主意。为什么不将其存储在文件中并将文件名放入数据库中?顺便说一句,你在使用 FILESTREAM varbinary 吗?

标签: c# sql sql-server-2008


【解决方案1】:

SQL 数据库并未真正针对存储大量二进制数据进行优化。我建议将byte[] 内容存储在一种适用于大型文档的存储形式中。例如:

  • 硬盘上的文件
  • 像 AWS 这样的基于云的 blob 存储解决方案

然后让您在 SQL Server 中的表存储对该文档的引用(例如文件路径或 AWS ID)。

【讨论】:

  • 确实,数据库不能替代文件系统。
  • 如果你能向 OP 添加更多关于 为什么 的解释,特别是他以后应该如何访问 它会很好。
  • 我可能会在文件共享中保存和索引这些数据。我仍然想完成这个 POC,因为我认为它仍然是可能的。 VARBINARY(MAX) 可以容纳 2^31-1 字节/2+ GB。瓶颈可能在哪里?
  • @neonScarecrow:关系数据库使用内部存储机制,这些机制针对存储和查询相关的结构化数据(例如数字、字符串和日期)进行了优化。它们在存储和检索大量二进制数据方面通常效率很低。仅仅因为 VARBINARY(MAX) 类型能够存储这些数据,并不意味着它可以如此快速地存储这些数据,或者不会影响性能。如果您想在 SQL Server 中存储这种大小的数据,最好将此数据存储为 BLOB:msdn.microsoft.com/en-us/library/bb895234.aspx
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 2013-04-02
  • 1970-01-01
  • 2012-10-15
  • 2018-06-03
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多