如何在查找

时间:2017-09-29 12:53:49

标签: ssis

我们的SSIS软件包第一次运行时会完全加载,之后会增加负载。所有查找都使用完全缓存,但它可能不适合增量加载,因为一些查找表包含数百万条记录,增量加载可能很小。

是否可以根据某些参数动态设置Lookup是使用完全缓存,部分缓存还是无缓存?

解决方案

由于数据库和SSIS包位于同一服务器上,因此查找列上具有索引的部分缓存与完全缓存的完全缓存一样快,对于增量加载甚至更快。

2 个答案:

答案 0 :(得分:0)

我无法看到这样做的方法,但潜在的替代方案是:

  1. 构建两个不同的数据流任务,每个缓存类型一个,然后使用变量/逻辑通过在优先约束上设置表达式来决定运行哪个。

  2. 使用变量中的SQL语句作为Lookup连接,并仅选择所需的记录,例如,它是否基于日期范围或类似的记录。然后,您可以在每次执行之前构建SQL语句。

答案 1 :(得分:0)

这是我正在使用的一个技巧。创建 2 个查找。首先是使用完整缓存进行查找并在不匹配时重定向。它的不匹配分支进入完全相同但处于部分缓存模式的第二次查找。这个不匹配政策是你真正需要的。两次查找的匹配结果合并为一个联合。

现在是棘手的部分。您离开数据流以控制包含它的流。当您选择该数据流元素时,您可以在其属性中找到表达式。在这些表达式中,您会发现以下条目 [].[SqlCommand]。在那里你应该为你的查找构建一个表达式,当你想使用部分查找时,它会向它添加一个错误条件。

这是一个简单的例子。假设您有 IsFullLookup 布尔变量,在初始加载较大时将其设置为 true,在增量加载较小时设置为 false。假设您的查找查询如下所示。

with open("sampledata.csv", "r") as infile,\     
   open("outfile.csv", mode="w") as outfile:     
   f = infile.read()     
   f = f.replace("\n", " ")     
   outfile.write(f)

那么表达式可能看起来像这样

SELECT Value, Key FROM MyLookupTable

这是如何工作的。如果您的 IsFullLookup 变量为真,则查询保持不变。它执行完全加载到缓存,所有匹配的值直接合并所有。不匹配的值进入部分缓存查找。这是这种方法的缺点,因此如果您在满载时有太多不匹配的值,这可能不是最好的方法。

如果您的 IsFullLookup 为 false,则完全缓存会很快生成 0 行。所有查找也会很快产生不匹配,并且您的行都被重定向到以常规方式完成其工作的部分缓存查找。在这种情况下,您可以以最小的开销获得纯粹的部分缓存查找。

这种技术使您的包裹比以前更丑陋。但是,如果您使用大型查找表,则完全值得。在您的日常负载中,您不会在大型查找上花费额外的时间和内存。但在极少数情况下,当您需要完整(或只是大量)加载时,部分缓存不会成为灾难。