插入表 select * from table vs 批量插入

Vir*_*tel 9 sql-server insert select bulk-insert

我只是想知道 SQL 语句INSERT INTO TABLE1 SELECT * FROM TABLE2,会像批量插入一样工作吗?

如果没有,有没有办法在插入记录时排除索引。进程在一次执行中插入 1.5 亿条数据。

我们计划创建阶段表(不会有任何索引Table1),然后将其从阶段表转移到目标表(会有索引Table2

我们不是在从过程中创建平面文件的情况。

但是当我们将数据从Table1(未编入索引)传输到Table2(编入索引)时,我们正在寻找可以加快处理速度的方法。

任何方式使用BulkInsertTable1Table2

Kin*_*hah 14

您最好的选择是使用SSISBULK INSERT。使用它们时,您可以进行各种性能改进,数据加载性能指南 中详细记录了这些改进

SSIS级别,您可以查看以下内容以加快数据读取和数据加载:

  • 快速解析选项及其局限性。
  • 将 SQL Server Native Client 10.x OLE DB 提供程序用于内存中的高性能连接
  • 将数据包大小设置为 32767
  • 选择 OLE DB 目标数据访问模式“表或视图 - 快速加载”选项

有关更多详细信息,请参阅加快 SSIS 批量插入到 SQL Server的速度。

以下是一些改进 BULK INSERT 操作的好方法:

  1. 使用 TABLOCK 作为查询提示。
  2. 在批量加载操作期间删除索引,然后在完成后重新创建它们。
  3. 在加载操作期间将数据库的恢复模型更改为 BULK_LOGGED。
  4. 如果目标具有聚集索引,则在批量插入操作中指定 ORDER BY 子句将提高批量加载的速度。
  5. 在 BULK INSERT 操作开始时使用 Trace Flag 610。

最大并行度应该在服务器上配置而不是默认值。您可以在此处参考我关于如何配置它的回答。

如果您使用的是 SQL Server 2014,则SELECT ... INTO是并行的

此外,您应该监控服务器上的等待统计信息,尤其是 SOS_SCHEDULER_YIELD,这会导致具有多个 CPU 运行并发批量加载操作并竞争相同 CPU 周期的服务器上的调度程序争用。

另请参阅: