开篇介绍
查找转换控件跟合并联接转换控件实现结果是一样的,但是实现方式有本质区别。查找转换通常在内存中缓存数据集,然后在输入管道中,将引用的数据集每一行与缓存中的数据进行比较查找。
查找转换的三种缓存模式:完全缓存,部分缓存,无缓存。
完全缓存:从数据库加载缓存,输入管道数据在缓存中查找有没有对应的数据,找到输出,未找到输出。(一般用于引用的数据集比较小,缓存速度快)
部分缓存:例如userid=1先在数据库中查找,如果找到,获取username,并将userid/username组合放入缓存中。如果以后userid=12再次通过组件,将会从本地缓存中获取username。然而,如果本地缓存没有找到该键,那么会再次检查数据库是否存在该键(有可能以前存在本地缓存中,由于内存压力过大,释放了部分内存)。如果没找到,则视为不匹配行。(如果在缓存中命中率低,会造成数据库重复调用的。解决办法:为不匹配的项添加缓存即可,把缺失缓存与部分缓存结合使用)
缺失缓存:只有部分缓存模式才有缺失缓存功能。如图所示:
无缓存:输入一条数据,就请求数据库一次。可想而知消耗性能多大。慎重使用。(系统参考数据不稳定的时候,任何缓存都只会显示旧的,错误的结果。这时无缓存模式就体现出价值了。)
案例介绍
AdventureWork数据库做示例,将订单标题SaleOrderHeader与订单信息SaleOrderDetail用合并联接,在查找转换查找订单对应用户名Customer。
步骤:
a.SaleOrderHeader与订单信息SaleOrderDetail用合并联接,详细步骤就不细将了。
SRC_Detail的Sql命令:
SRC_ORDER_Header的Sql命令:
注意:两端输入源要告诉合并联接控件,我是排序的。可以合并。
两种方法:一.用排序控件即可 。
二.右击数据来源控件,显示高级编辑->输入和输出属性,issorted属性改为True。
指定要排序的那列,把SortKeyPostion 改为1 。合并联接就知道它是排序的了。
b.查找转换控件查找对应用户名
最终图(Union All控件只是为了作为数据目标,测试作用):
查找转换控件配置:
常规:customer表数据不大,用完全缓存最优。连接类型用OLEDB连接管理器。(以后再讲,缓存连接管理器的作用)
将无匹配行重定向输出。如果选择则组件失败,那么引用表customer中无匹配的数据将会报错。
连接:连接customer表,引用customer表查找对应名字。
错误输出:用户名截断设置为重定向,把截断的数据重定向输出
匹配行结果UnionAll:三张表数据查找联接一起。
附加:级联查询
有时候需要使用多个查找转换来完成相应工作,可以实现更高的性能。上图做说明
使用80/20规则改进解决方案:
例子说明:夏天棉袄基本不可能卖出去,那为什么还要加载到查找转换中?加载使用频率高的产品会更合适。根据使用频率和普及率将其中20%加载到完全缓存。
第一个查找转换(完全缓存)存储20%的参考行,并且是频繁查找的行,有希望成功应答80%的查找请求。很大程度上取决于创建正确的查询以获取20%正确参考行的用户。对于剩下20%请求失败的,将它们重定向到部分缓存查找转换中,该操作将针对其他80%的参考行(没有存储在第一个查找转换中的参考行)来进行。
因为部分缓存,对内存要求不超过限制。有时候部分缓存和无缓存一起使用或者替代部分缓存。
总结
级联查询优点:对于常见的查找进行有效执行,而对于不常见的项将其转移到较慢模式下执行,提高整体效率。
缺点:牺牲多点的开发时间。