- Lookup 表: 即需要导出数据的数据源表 (或视图)
- Reference 表:即在Lookup 操作中使用的数据表(或查询)
- Full Cache, 默认情况下,Lookup 使用Full Cache 模式。在这种模式下,所以的Reference 表的记录将被一次性地导入到内存中,在以后的处理中将 SSIS 将在内存中调用 Reference 表的内容。这种方式将会使用大量的内存,并且不需要 Reference 表提前建立索引,整个的传输处理将在所有的Reference记录导入到内存后开始。当 Reference Table 记录数很大的时候,这种方式最快,但需要大容量内存的支持。
- Partical Cache,在最初始状态下,Cache 是空的。数据流操作从Lookup 表数据源读取一条新纪录到内存后,首先查找Cache中符合条件的 Reference 表的记录,如果没有找到,则从Reference 表的数据源中查找,并将查到的记录加如到Cache 中。这种方式不等待 Reference 表中的所有记录导入到Cache中再开始数据流操作,而是立刻进行数据从数据源到目标的传输。当 Lookup 表中的对应Reference 表的外键不是很大的时候,这种方式很快。
- No Cache,不使用Cache。这是速度最慢的一种 Lookup, 当系统内存不足以建立Cache的时候使用。但是由于 SSIS 2008 怎加了文件Cache的功能,所以这种方式的Cache用途不大。
在图中,只有当选择 Full cache 模式的时候,才可以使用 Cache connection manager, 这种情况下将使用一个预先建立好的Cache文件作为Reference 表,而不是从Reference的数据源读取数据,这种方式将直接使用Cache 文件,而不需要再将Cache 文件读到内存中。于此不同,如果使用 OLE DB connection, 将会建立和使用 OLE-DB 连接到 Reference 表,所有的记录读入内存中形成Cache。
使用 Full Cache 模式下的文件Cache 有下面的几个好处:
- 节约内存,因为使用文件Cache, 并不会在内存中形成Cache。Cache 文件是一个索引了的特殊的文件格式,所以读取速度也很快。
- 共享文件Cache, 如果很多数据流操作使用同一个Reference 表,可以共享这个文件Cache, 而不需要为每一个数据流单独建立相同的Reference 表。
下面通过一个例子,我来介绍使用SSIS 2008 的这个新的功能。
- 从AdventureWorks 选择两个表:HumanResources.Employee 和 Person.Contact, 这两个表的关联如下图所示:
- 在图中,ContactID 做为外键连接了Employee,VendorContact 和 Contact 表, 我们可以用一个简单的SQL 查看它们的关联:
FROM HumanResources.Employee emp
INNER JOIN Person.Contact con ON emp.ContactID = con.ContactID
假设我们要把记录导出到SSISTraining Database下的一个新表:NewEmployee 表,这个新的表包含了Employee 和 Contact 两个表的内容:
USE [SSISTraining]
GO
CREATE TABLE [dbo].[NewEmployee]
(
[EmployeeID] [int] PRIMARY KEY NOT NULL,
[FirstName] [nvarchar] (50) NULL,
[LastName] [nvarchar] (50) NULL,
[BirthDate] [datetime] NULL,
[gender] [nchar] (1) NULL
)
GO
下面我们就来用这个例子来演示 SSIS 2008 的这个新的功能
- 新建一个SSIS 项目,把默认的SSIS Package 修改为CreateNewEmployee
- 使用OLEDB 建立到两个数据库的连接,分别命名为:AdventureWorks 和 SSISTraining
- 将第一个 Data Flow Task 添加到Control Flow 页面中,并将其命名为 Create Cache File
- 双击这个数据流任务,将一个 OLEDB Source 添加到 Data Flow 页面中,设置其OLE DB connection manager 为 AdventureWorks,并使用下面的SQL 语句获得数据:
SELECT ContactID,FirstName,LastName from Person.Contact
- 从工具箱中的 Data Flow Transformations 选择 Cache Transformation 并将其添加到 Data Flow 页面中,双击这个 Cache Tranformation进行编辑。
- 首先需要建立一个到 cache 文件的连接,这个特殊的连接用来连接到特殊的Cache 文件,文件的扩展名必须为 caw.
- 在图中,选中 Use file cache,并将文件名设置为 C:\MyCache.caw,然后再单击 Columns 页面选择适当的关键值列。在我们的例子中,pipeline 中有三个列:ContactID,FirstName 和LastName, 其中FirstName 和 LastName 是需要返回值的列,而 ContactID 是需要和Lookup 表进行Join 的列,这个列通常叫做 Key,这个Key 列(或列的组合) 需要在图中Index Position 中赋予一个序号,表示我们需要按Key 列进行排序,第一个列从1 开始,如果有三个Key 列,那么他们的Index Position将分别是1,2,3.
- 保存以上的设置后,我们还需要在图中设定 Cache 文件和源数据的映射关系:
- 保存以上的设置。完成了的 Data Flow 页面如下图所示:
- 上面的操作将在运行中将Reference 表的内容存放在Cache 文件中,下面的步骤用来访问这个 Cache 文件。在 Control Flow 页面中再加入第二个Data Flow Task,将这个新的Control Flow 命名为 Load Employee Table,双击打开它的 Data Flow 页面;
- 首先使用一个 OLE DB 数据源连接到 AdventureWorks 下的 HumanResources.Employee 表,使用下面的SQL 语句从表中取得记录:
SELECT EmployeeID, ContactID, Gender, BirthDate FROM HumanResources.Employee
- 然后再将一个 Lookup Transformation 添加到 Data Flow 页面中,连接 OLEDB 数据源到到这个 Lookup Transformation,双击 Lookup 打开 Lookup Tranformation 设置页面。在General 页面中选择 Full Cache 下的 Cache Connection Manager 连接类型;在 Connection 页面下选择刚刚建立的 Cache 文件连接;在 Columns 页面中选择 ContactID 作为Lookup 列,Firstname 和 Lastname 作为返回值的列。
- 保存并运行这个SSIS Package。
结论
当Reference 表非常大的时候比如说1G 以上,使用 Cache lookup 会占用非常少的内存,并且Cache 文件可以被多个Lookup 共享而不消耗更多的内存。Cache Lookup 是 SSIS 2008 中一个最重要的性能提高,它使得SSIS 更加适应大数据的ETL 处理。
我们同时制作了本例操作的视频教程,欢迎访问:www.bridata.ca/training
No comments:
Post a Comment