【问题标题】:How to efficiently INSERT INTO a big table如何有效地 INSERT INTO 大表
【发布时间】:2018-04-18 21:47:32
【问题描述】:

我已将一张大表保存为generate script(如this)。所以生成的 sql 文件有大约十亿行 INSERT INTO 代码。假设该表大约 30 Gb,而我的计算机有 64 Gb RAM - 在这种情况下,我认为我们不应该将所有 30 Gb 数据加载到内存中。

所以我的问题是,当我执行这个 sql 文件(许多 INSERT INTO)时,sql 是否会尝试将所有内容加载到 RAM 中?还是自动批量执行?

如果sql没有自动分批,我该怎么做呢?谢谢-


大图: 我需要将一个大表保存到硬盘中,转到另一台计算机并将表导入那里的 sql server

【问题讨论】:

  • 最好使用 bcp 导出然后使用 bcp 导入这么大的表,例如sqlserver-training.com/how-to-backup-sql-table(假设实际上创建一个真正的备份不是你的选择)
  • 正如亚历克斯所说,bcp 是你的朋友。不过有几个问题。新表是否在同一个数据库中?就内存管理而言,您可以通过编辑“最大服务器内存”来限制 SQL Server 可用的内容(在 SSMS 中右键单击您的服务器并选择“属性”)
  • 不要那样做。特别是如果您有大量数据。 SQL Server 具有非常强大的 ETL 工具。创建架构,然后使用导入向导以流方式加载 数据。下面使用相同的批量导入功能。这样您就可以跳过将数据写入文件的过程。您可以保存生成的 SSIS 包并对其进行编辑或安排它与 SQL Server 代理一起运行
  • 你为什么要首先编写表格?您是否正在尝试创建“备份”?不需要,因为 SQL Server 也有真正的备份。您是否尝试将数据库部署到生产环境?您可以从原始位置进行备份并将其还原到生产环境或分离原始数据库,复制文件并重新附加它。定期加载数据?这就是 SSIS 的用途。添加更改跟踪,您只能加载自上次加载以来更改的几千行
  • 谢谢@PanagiotisKanavos 请参阅 OP 中的更新。我需要将一个大表保存到硬盘驱动器,转到另一台计算机并将表导入那里的 sql 服务器。对于你提到的导入/导出向导,两台计算机必须连接内网,对吗?见 stackoverflow.com/questions/47118284/…>.

标签: sql-server ssis sql-insert etl bcp


【解决方案1】:

我会推荐bcp 进行这样的操作。

这将涉及两个步骤:

  1. 通过发出如下命令使用 bcp 导出数据:bcp dbo.someTable out "C:\someTable.txt" -c -T。其中dbo.someTable 是包含您的数据的表格。
  2. 通过发出如下命令导入数据:bcp dbo.someNewTable in "C:\someTable.txt" -c -T。其中dbo.someNewTable 是存储导出数据的新表。

如果您热衷于明确管理batch size。您将使用-b 参数。来自 MS 文档:

默认情况下,数据文件中的所有行都作为一批导入。要在多个批次之间分配行,请指定一个小于数据文件中的行数的 batch_size。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2021-07-22
    • 2010-10-26
    相关资源
    最近更新 更多