用于表到表插入的SSIS与(仅限SQL)INSERT INTO()SELECT FROM方法

时间:2011-10-05 13:35:09

标签: tsql sql-server-2008 ssis

我目前正在将大量记录从一个表转移到另一个表,并在此过程中进行了总结。所以,我有一个这种通用格式的SQL:

INSERT INTO TargetTable
   (Col1,
   Col2,
   ...
   ColX)
   Tot
   )
SELECT
   Col1,
   Col2,
   ...
   ColX
   SUM(TOT)
FROM 
   SourceTable
GROUP BY
   Col1,
   Col2,
   ...
   ColX

使用SQL SELECT作为源将记录从一个表传输到另一个表时,将此SQL移入SSIS任务是否有任何性能优势?例如,是否已关闭日志记录?

次要问题:我是否有任何策略可以确保最高转移率?例如,在插入,锁定表等之前从Target表中删除索引?

2 个答案:

答案 0 :(得分:3)

根据我的经验(并且,请记住,自从我完成此操作已经过去了一年并且发生了变化),您从SSIS获得的唯一优势是它能够利用bulk insert task。这会增加一个额外步骤,要求您在开始导入过程之前将源数据导出到平面文件。

或者,如果您坚持使用SQL语句,this article中标题为使用INSERT INTO ... SELECT以批量导入数据并使用最小日志记录的部分提供以下建议:

  

您可以使用INSERT INTO SELECT FROM将一个表(例如登台表)中的大量行有效地传输到另一个具有最少日志记录的表。最小的日志记录可以提高语句的性能,并降低操作在事务期间填充可用事务日志空间的可能性。

     

此语句的最小日志记录具有以下要求:

     
      
  • 数据库的恢复模型设置为简单或批量记录。
  •   
  • 目标表是空的或非空的堆。
  •   
  • 目标表不用于复制。
  •   
  • 为目标表指定了TABLOCK提示。
  •   

我个人不喜欢SSIS软件包的原因有一个特殊原因:我从来没有一个DBA致力于维护它们。我工作的数据导入项目需要大量的摆弄,因为源数据不干净(我认为这对你来说不是问题),所以我有很多软件包在测试环境中工作得很好有限的数据样本在部署到生产中时立即崩溃,这使得该过程在颈部难以处理。

这只是我的观点,但我想说,除非您或与您合作的其他人专注于SSIS包作为数据库维护的一部分,否则更容易维护和记录存储过程中的进程。 / p>

答案 1 :(得分:2)

将记录设置为简单。将日志大小设置得足够高以处理插入。系统上有其他人吗?一个tablock将帮助插入 - TargetTable with(tablock)。如果您在TargetTable上有聚簇索引,则在select中使用该方式的数据。如果你可以用(nolock)接受脏读SourceTable。如果要插入超过100,000条记录,则可能需要使用where来分解插入。