SSIS - 处理不同数据库之间的大量记录
SSIS - handle large number of records between different databases
我想导出平面文件并遇到这个棘手的问题:
- 我有一个从 OracleDB 中选择的查询(大约 800 万条记录)
- 其中一个返回字段(ISO 国家代码)由两个不同的列选择
- 我想对此字段进行转换(例如 'GBR' 到 '1' ,'RUS' 到 2 等)
- 如果我尝试在查询中使用
IN
运算符,它会花费太长时间(因为我有 7 个案例,每个案例大约有 30 个值)。也因为#2,我需要一个子查询。
- 我没有特定数据库的权限。我能做的就是
select
.
- 我尝试使用临时(带记录)和参数化(带参数组)OLEDB 表,但是将 800 万条记录从一个数据库移动到另一个数据库,然后再次与参数化连接也是 运行 几个小时。 (请注意,OLEDB 是我唯一可以使用的数据库)
我读过当您有这么多值时尝试使用派生列来执行此操作并不是最好的主意,但我仍然想不出更好的方法。有什么建议吗?
Edit:
具体说法如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
为您的转换创建一个简单的文本文件 (CSV),如下所示:
CountryISO,ID
USA,1
ARG,2
ESP,3
CHN,4
HKG,4
创建缓存连接管理器来存储您的转化;为此转换文件使用平面文件连接,并在 DataFlow 任务中将其加载到缓存连接上。
在上一个之后的单独DataFlow中(之前需要在单独的DataFlow任务中加载缓存),用Lookup搜索加入你的Oracle结果,其中Lookup有"Full Cache"(存储所有引用内存中的值)和您的 "Cache connection manager" 设置。
您可以按照this post作为示例。
我想导出平面文件并遇到这个棘手的问题:
- 我有一个从 OracleDB 中选择的查询(大约 800 万条记录)
- 其中一个返回字段(ISO 国家代码)由两个不同的列选择
- 我想对此字段进行转换(例如 'GBR' 到 '1' ,'RUS' 到 2 等)
- 如果我尝试在查询中使用
IN
运算符,它会花费太长时间(因为我有 7 个案例,每个案例大约有 30 个值)。也因为#2,我需要一个子查询。 - 我没有特定数据库的权限。我能做的就是
select
. - 我尝试使用临时(带记录)和参数化(带参数组)OLEDB 表,但是将 800 万条记录从一个数据库移动到另一个数据库,然后再次与参数化连接也是 运行 几个小时。 (请注意,OLEDB 是我唯一可以使用的数据库)
我读过当您有这么多值时尝试使用派生列来执行此操作并不是最好的主意,但我仍然想不出更好的方法。有什么建议吗?
Edit:
具体说法如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
为您的转换创建一个简单的文本文件 (CSV),如下所示:
CountryISO,ID
USA,1
ARG,2
ESP,3
CHN,4
HKG,4
创建缓存连接管理器来存储您的转化;为此转换文件使用平面文件连接,并在 DataFlow 任务中将其加载到缓存连接上。
在上一个之后的单独DataFlow中(之前需要在单独的DataFlow任务中加载缓存),用Lookup搜索加入你的Oracle结果,其中Lookup有"Full Cache"(存储所有引用内存中的值)和您的 "Cache connection manager" 设置。
您可以按照this post作为示例。