【问题标题】:SQL Server copy table 112000+ records and a BLOB fieldSQL Server复制表112000+条记录和一个BLOB字段
【发布时间】:2012-09-22 19:34:45
【问题描述】:

我有一个表 (A),其中包含 112000 多条记录和 38 列,包括一个 BLOB 表(最大大小为 2Mb 的 PDF/PNG 文件)。该表有大约 13Gb 的数据空间和几乎 9Gb 的索引空间。出于规范化目的,我创建了另一个表 (B) 来存储这些 BLOB 数据。表 A 将具有来自表 B 的 FK。

我在将表 A 中的数据插入表 B 时遇到问题......这需要的时间太长了。我试过SELECT INTO 和导出向导。第一选择跑了 2 小时,我不知道需要多长时间。导出时第二个选择失败(设法插入大约 35000 条记录)。

所以,我的问题是:有没有更快的方法?有什么我可以做的,所以我可以做到这一点?我的意思是,尽管磁盘空间很大,但 112000 条记录似乎并不算多。

【问题讨论】:

    标签: sql sql-server blob blobstore


    【解决方案1】:

    虽然不清楚加载失败的原因,但如果您尝试将数据加载到一个大的INSERT 语句中,如果您将工作分成块,性能将会提高。不要一次做一排。尝试加载总计约 10M、50M、100M、250M 等的行,直到找到有效的“最佳位置”。

    【讨论】:

    • 谢谢@PhilipKelley。无论如何,我怎样才能找到问题所在(如果有的话)?我可以通过一些索引优化来改进它吗?
    • 索引会减慢插入速度——您不仅必须添加一行,还必须将其正确插入到 each 索引中。正如@Kumar 所说,删除和重建索引可以提高性能。这在“实时”数据库上并不实用,但对于后台或夜间进程来说,这是一种标准技术。
    • 至于性能损失在哪里,请查看您的数据库事务日志文件。您在数据库中更改的任何内容也会在那里更改。如果您正在运行 xxGB 数据的插入(13G 数据和 9G 索引?),您将需要 更多 比 t-log 文件中的 xxGB。将其分成块允许重用/重新分配 tlog 文件中的空间——当然,只要您使用简单的恢复模式。
    • 感谢菲利普和库马尔。它就像一个魅力......我已经设法在 2000/3000 的记录中做到这一点。我已经使用“row_number() over”来完成它。半小时后,它完成了!谢谢!
    【解决方案2】:

    最好的方法是拆分成更小的块,然后像 Philip Kelley Said 那样使用 while 循环插入。 .删除目标表上的所有非聚集索引,插入数据后创建它们。 .如果您安装了 SQL Server BI 工具,请使用那里的导入导出向导并创建一个基本包,它会做得很好 .它不会取决于您的磁盘空间,取决于您与其他进程的内存共享。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多