【问题标题】:SSIS Lookup Returns Too Much DataSSIS 查找返回太多数据
【发布时间】:2023-02-10 05:57:57
【问题描述】:

我有一个 SSIS 程序包,可以对包含数千万行的表执行查找。似乎默认情况下它将表中的所有行返回到 refTable,然后从 refTable 中选择列与指定参数匹配的位置以查找匹配的查找。是否必须插入 refTable 才能执行此操作?我可以直接用参数过滤掉吗?目前它正在将数百万条记录拉入 refTable 并且浪费了大量时间。这样做是因为正在从该 refTable 中查找多条记录,还是每次它试图查找的每次查找都提取所有这些记录?

这是缓慢的方式和我建议的新方式:

-- old
select * from (SELECT InvoiceID, CustomerId, InvoiceNumber, InvoiceDate
 FROM Invoice) [refTable]
where [refTable].[InvoiceNumber] = ? and [refTable].[CustomerId] = ? and [refTable].[InvoiceDate] = ?

-- new
SELECT i.InvoiceID, i.CustomerId, i.InvoiceNumber, i.InvoiceDate
 
 FROM Invoice i
where i.InvoiceNumber = ? and i.CustomerId = ? and i.InvoiceDate = ?

【问题讨论】:

  • 您是否使用 SSIS 的查找?如果是这样,您使用什么缓存模式?
  • @raphi5430 部分缓存模式。记录被拉回到 refTable 是因为它对它试图查找的每一行使用相同的记录吗?还是每次执行查找时都会创建大量的 refTable?例如,我正在处理一个包含多张发票的 XML 文件。它每次都在构建那个巨大的 refTable 吗?

标签: ssis


【解决方案1】:

每次在源数据中遇到新的不同值时,部分缓存模式都会对数据库进行新的调用。之后它会检查这个新值。它不是在创建一个 massiv ref 表。 两个查询

Select * FROM A WHERE A.Id = ?

SELECT * FROM (SELECT * FROM A) [refTable] WHERE refTable.Id = ?

有相同的执行计划。所以没有区别

不同缓存模式的概述: Overview over caching modes

您可以通过不使用整个表作为查找连接而是使用仅返回您需要的列的 sql 查询来加快整个过程。

【讨论】:

    【解决方案2】:

    问题是我有一个查找是完整缓存而不是像其他的部分缓存,它加载了将近一百万行,所以它减慢了很多速度。我创建了一个很好的索引,因此对每个源项进行查找也不错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      相关资源
      最近更新 更多