SSIS 对数据排序

一般来说,数据排序有两种方式:使用Sort组件,使用TSQL命令Order by。使用Sort组件排序,对SSIS来说,是一种阻塞性的操作,这意味着,SSIS组件必须等到所有的数据都加载到内存之后,才能按照特定的字段对数据执行排序操作。然而,如果使用TSQL命令的Order by子句,在关系引擎中执行排序操作,然后,把有序的数据加载到内存中,这样对SSIS说,是一种流式操作,这意味着,SSIS组件不需要等到所有的数据都加载到内存中,就可以开始处理数据,不仅节省系统的内存资源,而且数据处理的流程更快。

一,使用Sort组件进行排序

使用Sort组件对无序的数据进行排序,必须要设置排序键,排序列的位置,排序的类型(升序或降序):

SSIS 对数据排序

SortType:升序 ascending,降序 descending,

SortOrder:排序列的位置,从1开始依次递增,

Sort组件还有一个属性:Remove wors with duplicate sort values,该属性指定,当排序列重复时,Sort组件是否删除重复的行?这不同于distinct命令,distinct是输出的所有列不重复。如果选中该属性,只是保证排序列(输出列的一部分)不重复,该属性也可以从Sort Transformation Advanced Editor中查看和设置,默认值是False,不删除重复值:

SSIS 对数据排序

二,使用TSQL命令的Order by 子句对数据进行排序

在数据源中,数据访问模式选择为SQL command,通过编写TSQL代码,对数据排序。

step1:使用OLEDB数据源组件对数据排序,该数据源组件向下传递的数据是有序的:

SSIS 对数据排序

Step2,打开OLEDB的高级编辑器,查看输入和输出属性选项卡

1,点击OLEDB Source Ouput,设置IsSorted属性为True,该属性设置为true不会对数据排序,只是告知下游组件,该输出数据已经排序。

如果将IsSorted属性设置为True,实际数据并没有排序,在package 运行时会出错,所以必须提供已经排序的数据(在TSQL命令中使用order by子句对数据排序)

2,点击Output Columns,逐个设置排序列(Order by Column_List)的SortKeyPosition属性

SortKeyPosition属性有Sort Position和Direction 两个metadata:

正整数表示按照升序排序,0表示不是排序列,负整数表示按照降序排序,数字代表排序列的序号

例如,对于以下的TSQL语句:

select Col_1,Col_2,Col_3,Col_4
from dbo.TableName
order Col_1 asc, Col_2 desc,Col_3 desc

在Output Columns中需要逐个设置,Col_1,Col_2,Col_3,Col_4的SortKeyPosition
由于Col_1,Col_2,Col_3是排序列,序号从1依次递增,而Col_4不是排序列,所以SortKeyPosition的配置如下

  • Col_1 的SortKeyPosition是 1,第一个排序列,且按照升序排序
  • Col_2 的SortKeyPosition是 -2,第二个排序列,且按照降序排序
  • Col_3 的SortKeyPosition是 3,第三个排序列,且按照升序排序
  • Col_4 的SortKeyPosition是 0,不是排序列

SSIS 对数据排序

SSIS 对数据排序

SSIS 对数据排序

三,性能比较

经过测试,使用关系型数据库输出有序的数据流,能够充分利用关系型数据库的性能,加快SSIS 引擎处理海量数据任务的性能。因此,当需要从关系型数据库中加载有序的数据时,建议使用SQL命令对数据排序。

对于需要从非关系型数据库中加载数据的数据源,这类数据量一般不大,对数据排序的时间和资源消耗较小,对Sort组件来说,能够很快完成。

参考文档:

Sort Data for the Merge and Merge Join Transformations

上一篇:0036 Java学习笔记-多线程-创建线程的三种方式


下一篇:C#线程学习笔记三:线程池中的I/O线程