Lookup组件的使用与它的几种缓存模式:Full Cache,Partial Cache,NO Cache
|
这个例子往小了说就是一个表到另外一个表根据那些列然后关联查询出一些列合并或者不合并输出,往大了说可以想象一下更多的场景。比如数据源是一个或者一批文件,Excel,需要定期将文件或者Excel中的数据同步更新到一个数据表中。比如将业务系统中的表数据更新到数据仓库中,更新一下数据仓库中的一些维度属性或者事实数据(事实数据一般很少更新),或者添加一些新的事实数据。所以,Lookup 的使用在 SSIS 中相当于大多数组件来说使用的频率还是比较高的。虽然,它的某些功能实现完全可以用其它的组件或者逻辑来代替,甚至直接使用 SQL 语句。但是某些时候,我们还是还考虑使用 Lookup,因为 Lookup 里有一些缓存的设计,可以提高我们处理数据的效率,特别是在 SSIS Package 中反复使用到同一个 Reference 对象的时候。 因此我们有必要了解一下 Lookup 的缓存模式。 下面提到的缓存模式只适用于 OLE DB Connection Manager, Cache connection manager 类似于 OLE DB Connection Manager 中的 Full Cache Mode。
完全缓存模式 - 这是 Lookup 的默认选项,选择这个模式后,在数据流 Data flow 真正执行之前就会将表中的数据或者对应查询结果的数据一次性的从数据源中将数据缓存到内存中。 特点: 数据流(SSIS)执行之前缓存全部结果集。 消耗内存大,增加了数据流的启动时间。 在数据流启动之后执行速度要快,数据不需要从数据源中再次读取。 数据源中的数据更新此时将不再影响到缓存中的数据。 缓存中的数据可以被后面的组件重复使用。 什么时候该使用 Full Cache? Lookup 数据集比较大的时候,一次加载到内存可以反复使用,而不需要反复的去查询数据库。 数据库服务器不在本地,为了减少查询次数的情况下也要考虑使用 Full Cache。 使用 Full Cache 模式时要注意的地方: 数据全部缓存在内存中,如果内存不够并不会将超出部分的数据缓存到磁盘上,而是直接报错 - Run out of memory。 由于数据集缓存在内存中,所以在使用 Lookup 的时候不应该直接使用表对象,而应该通过写 SELECT 语句来减少不必要的列输出并且可以加上 WHERE 条件来限定一下数据集的大小,简而言之缓存的数据应该只包含有用的数据。 数据一旦缓存,那么在数据流执行过程中就不会再去检测之前源数据是否发生改变或者更新等等,除非数据流重新启动执行。
部分缓存模式下,数据流开始时缓存还是空的。当时数据流开始执行后,当 Lookup 组件需要根据输入行找匹配数据的时候,这时 Lookup 组件会先检查一下缓存有没有匹配的数据,如果没有就查询数据库,如果在数据库中查到匹配的数据行的时候就把这个数据行缓存起来,以便下次使用。 查询的过程可以这样理解,比如 Input Source 中有一个 ID1 与 Lookup 对象的 ID2 匹配,那么每次就是拿 ID1 到 Lookup 的缓存中查一下有没有 ID2的值和ID1的值匹配,如果没有的话就用 ID1的值作为一个参数到 ID2 所在的数据库进行查询,因为每次查询的结构是一样的,所以只通过传参数的形式,某种程序上重用了查询语句。 特点: 数据流启动之前,缓存为空,数据流启动时间要比完全缓存的情况下要快。 Lookup 的时候会慢,因为总要检查缓存,如果有的话就直接用,如果没有的话就需要查询数据库,每次查询都是一次开销。如果数据量比较大的话,那么开销就会非常大。 可以在 Advanced Options 中设置最大缓存,一旦缓存中的实际数据大小超过这个最大值的话,就会自动清理那些较少使用的数据为新的数据腾出空间。 什么时候该使用部分缓存? Lookup 缓存对象数据量较少的时候,不需要花时间等待全部缓存结束后再开始数据流的执行。
无缓存模式下,每次匹配查询都会去数据库查一次。这种缓存模式下,数据量不大并且内存比较紧张的情况下才会使用,当然它对内存的消耗也相对最小。 以上三种都是 OLE DB 的连接模式,从 SQL Server 2008 开始也支持了一种新的缓存模式 - 文件缓存模式。文件缓存是将 Reference table 中的数据存放到一个共享文件中可以供后面使用同一 Reference table 的 lookup 使用。它对内存的消耗很少,文件的数据直接存放在磁盘上,因此可以处理非常大的 Reference table 数据。 我个人觉得大多数情况下会选择 OLE DB 下的 Full Cache, 因为一般的BI项目数据量比较大并且数据大多主要是分析历史数据,所以对数据的实时性要求不高。同时,现在大多数服务器的环境也有条件让我们一次性加载足够多G的数据放到内存中缓存起来以重复使用。 From:cnblogs BIWORK (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




