将查找转换部分缓存限制为已加载的值

时间:2013-10-24 19:21:06

标签: ssis

我正在使用SSIS将数据从平面文件加载到SQL表。平面文件包含新行和更新行。每次运行该进程时,更新的行都将影响SQL表的一小部分,由“句点”列指定(例如,一个过程可能只影响第3,4和5期)。

我正在使用查找转换来从现有行(查找匹配输出)中分隔新行(查找无匹配输出)。由于引用集和加载的数据集都非常大,我想使用部分缓存进行查找。是否有可能将部分缓存查询修改为仅包含平面文件中包含的句点编号中的行?

例如,我的参考表可能包含1-10期的数据,但我加载的平面文件可能只包含3-5期的数据。因此,我只想缓存3-5期的数据,因为我已经知道1-2和6-10期间永远不会产生匹配。

2 个答案:

答案 0 :(得分:2)

除非您需要每行中的每一列,否则不要在下拉列表中使用表选择器,除非您需要每行中的每一列,否则请编写查询以仅回退匹配或扩充现有数据所需的列。在您的情况下,您将需要添加一个过于简单的过滤器。

我发现最好的方法是在String类型的变量中编写查询查询。在其中,我将构建查询并应用所需的过滤器。下面,您看到我定义了两个变量。一个int将作为我的过滤器,然后是查询本身使用它。

enter image description here

我的SourceQuery变量上的表达式是

"SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 
WHERE D.rn <= " + (DT_WSTR, 10) @[User::MaxID]

我的数据流看起来像

enter image description here

我有我的源码并且它会查找并根据匹配的结果将其发送到两个存储桶中的一个。我的源查询只生成数字1到10,查询是一个生成偶数2到20的数字的查询。

在设计时,该查询看起来像

SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 

正常运行将导致桶之间的50/50分割

enter image description here

当然,目标是使查询查询采用类似源组件之一的参数,但您很快就会发现

SELECT 
    D.rn
FROM
(
SELECT TOP 10
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  * 2 AS rn
FROM
    sys.all_columns AS SA
) AS D(rn) 
WHERE D.rn > ?

不会飞。相反,您必须返回控制流并选择数据流,右键单击并选择属性。在数据流窗口中,转到“表达式”并单击省略号(...)

enter image description here

将有一个名为Lookup任务的属性。分配使用表达式的变量使其全部动态且瞧,maxid为6我只找到3个匹配

enter image description here

最后一点,部分缓存可能是您正在寻找的,也可能不是。这是一个实际的查找设置,它控制如何平衡查找数据的成本与本地缓存。完整缓存会将适用范围的所有指定列删除到内存中,这就是您只想指定所需列的原因。如果你可以把它变成几个瘦的列,即使它是数百万行,你可能不会感到痛苦。

答案 1 :(得分:1)

受挫的例子:

  1. 在运行时收集你的最小值和最大值并将它们存储在两个变量中,PeriodMinimum和PeriodMaximum(我假设它是一个范围,我将在最后讨论替代方案。)
  2. 将它们作为派生列添加到您的源流中。
  3. 在Lookup Editor中的Advanced选项卡下,使用自定义查询(Contrived example):SELECT lookup,value FROM reference where between between?和?
  4. 单击“参数”按钮并相应地使用输入列。
  5. 如果您希望能够随机选择句点(3,6和10)而不是范围,那么您将不得不做一些更人为的事情......

    1. 创建多个变量,Period1,2,3 ... n并将默认值设置为-1或某个不是有效期的值。
    2. 根据需要使用您想要过滤的句点填充这些变量。
    3. 在自定义查询中,使用SELECT lookup,value FROM reference where period =?或期间=?或者句号=?,...
    4. 使用输入列设置每个参数。
    5. 无论如何,一般情况下,当您希望基于运行时数据进行动态查询查询时,请使用带有参数的自定义查询。