技术开发 频道

SQL Server集成服务非常好的实践:语句优化

  如果你将目标表不需要的列也做了转换,SSIS将会弹出警告提示信息,如:

  [SSIS.Pipeline] Warning: The output column "SalariedFlag" (64) on output "OLE DB Source Output" (11) and component "OLE DB Source" (1) is not subsequently used in the Data Flow task.

  Removing this unused output
column can increase Data Flow task performance.

  
[SSIS.Pipeline] Warning: The output column "CurrentFlag" (73) on output "OLE DB Source Output" (11) and component "OLE DB Source" (1) is not subsequently used in the Data Flow task.

  Removing this unused output
column can increase Data Flow task performance.

 

  当你在OLEDB源中使用“表或视图”或“来自变量的表名或视图名”数据访问模式时要小心,它的行为和select *一样,都会将所有列进行转换,当你确实需要将源表中的所有列全部转换到目标表中时,你可以使用这种方法。

  非常好的实践3:OLEDB目标设置的影响

  下面是一组会影响数据转换性能的OLEDB目标设置:

  数据访问模式:这个设置提供“快速载入”选项,它使用BULK INSERT语句将数据写入目标表中,而不是简单地使用INSERT语句(每次插入一行),因此,除非你有特殊需求,否则不要更改这个快速载入默认选项。

  保持一致性:默认设置是不会检查的,这意味着目标表(如果它有一个标识列)将会创建自己的标识值,如果你检查这个设置,数据流引擎将会确保源标识值受到保护,会向目标表插入相同的值。

  保持空值:默认设置也是不会检查的,这意味着来自源表中的空值将会插入到目标表中。

  表锁:默认设置是要检查的,建议保持默认设置,除非是同一时刻还有其它进程使用同一个表,指定一个表锁将会取得整个表的访问权,而不是表中多行的访问权,这很可能会引发连锁反应。

  检查约束:默认设置是要检查的,如果你能确保写入的数据不会违反目标表上的约束,建议不要检查,这个设置会指定数据流管道引擎验证写入到目标表的数据,如果不检查约束,性能会有很大提升,因为省去了检查的开销。

  非常好的实践4:每批插入的行数以及最大插入大小设置的影响

  每批插入的行数:这个设置的默认值是-1,意味着每个输入行都被看做是一个批次,你可以改变这个默认行为,将所有行分成多个批次插入,值只允许正整数,它指定每一批次包含的最大行数。

  最大插入提交大小:这个设置的默认值是“2147483647”,它指定一次提交的最大行数,你可以修改这个值,注意,如果这个值设得太小,会导致提交次数增加,但这样会释放事务日志和tempdb的压力,因为大批量插入数据时,对事务日志和tempdb的压力是非常大的。

  上面两个设置对于理解改善tempdb和事务日志的性能是非常重要的,例如,如果你保持最大插入提交大小的默认值,在抽取期间事务日志和tempdb会不断变大,如果你传输大批量数据,内存很快就会消耗光,抽取就会失败,因此最好基于你自身的环境为其设置一个合理的值。

  注意:上面的建议得益于我多年的DTS和SSIS使用经验,但如前所示,还有其它因素影响性能,如基础设施和网络环境,因此,当你将这些措施推向生产环境之前,最好做一次彻底的测试。

0
相关文章