SSIS - 处理不同数据库之间的大量记录

时间:2018-03-15 13:59:20

标签: sql performance ssis odbc oledb

我想导出一个平面文件并遇到这个棘手的问题:

  1. 我有一个从OracleDB中选择的查询(大约800万条记录)
  2. 其中一个返回的字段(ISO国家/地区代码)由两个不同的列
  3. 选择
  4. 我想在这个字段上进行转换(例如'GBR'到'1','RUS'到2等)。
  5. 如果我尝试在查询中使用IN运算符,则需要太长时间(因为我有7个案例,每个案例约有30个值)。也因为#2,我需要一个子查询。
  6. 我对特定数据库没有任何权利。我所能做的就是select
  7. 我尝试使用临时(带有记录)和参数(带有paragroup)OLEDB表,但是将8m记录从一个数据库移动到另一个数据库然后再次加入参数也运行了几个小时。 (请注意,OLEDB是我可以使用的唯一数据库)
  8. 我已经读过,当你拥有如此多的价值时,试图用Derived Column做这个并不是最好的想法,但我仍然想不出更好的方法。有什么建议吗?

      

    编辑:

    具体陈述与CASE WHEN dt.source_country_code IS NOT NULL THEN dt.source_country_code ELSE dt.trans_country_code END) AS Country类似。其余查询很大,不会影响此字段。该字段的结果是ISO国家/地区代码,例如:GRC,GBR,FRA,JPN ....应该完成的转换是标准的(如果我选择在查询中执行):

    case when Country in ('GRC','GBR','ESP','FRA','DEU','ROM','DNK','IMN','PRT','ITA','CZE','IRL','POL','AND','FIN','LVA','SHN','ATA','LIE','SMR','AUT','LTU','SVK','BEL','GIB','LUX','SVN','BGR','MLT','GRL','MCO','SWE','HRV','HUN','NLD','CHE','CYP','ISL','NOR','VAT','ROU','EST') then '1' 
      when Country in ('ALB','MDA','ARM','MNE','AZE','RUS','BLR','SRB','BIH','TJK','GEO','TUR','ISR','TKM','KAZ','UKR','XKX','UZB','MKD') then '4'
      when Country in ('USA','CAN') then '5' 
      when Country = 'CHN' then '6' 
      when Country = 'JPN' then '7' 
      when Country in ('AUS','NZL') then '8' 
      else '9' end) as CountryCode
    

1 个答案:

答案 0 :(得分:2)

使用您的转化创建一个简单的文本文件(CSV),如下所示:

CountryISO,ID
USA,1
ARG,2
ESP,3
CHN,4
HKG,4

创建一个缓存连接管理器来存储您的转化;对此转换文件使用平面文件连接,并在DataFlow任务中将其加载到缓存连接上。

在前一个之后的单独DataFlow中(缓存需要在之前的单独DataFlow任务中加载),使用Lookup搜索加入Oracle结果,其中Lookup具有“Full Cache”(将所有引用的值存储在内存中) )和您的“缓存连接管理器”设置。

您可以关注this post作为示例。