SSIS包查询优化

时间:2014-12-03 14:15:02

标签: sql-server ssis oracle10g query-optimization

我想了解如何修复程序中发现的小错误,该错误在Oracle数据库和SQL服务器数据库之间传输数据,用于我支持的Web订购系统。

问题是,当两个订单在同一天出现129和130时,如果后续订单(130)首先得到验证,那么之前的网络订单(129) 不会转移到Oracle DB。发生这种情况是因为该程序检查传输到Oracle DB的最大Web订单,并尝试仅移动高于此的SQL Web订单号。

在SSIS包中构建的支持此概念的查询如下:

在Oracle方面

  Select nvl(max(web_order_id),0) maxOrderIDParam from web_shipping

在SQL Server端

  SELECT cast(web_order_id as float) web_order_id, web_entry_date, site_num, protocol_num,    inv_num, cast(pharm_num as float) pharm_num, status, comments, username, porstatus 
  FROM        Web_Shipping
  WHERE web_order_id > ?
  AND status = 'V'
  ORDER BY web_order_id

在Oracle方面

  insert into web_shipping (web_order_id, web_entry_date, site_num, protocol_num, inv_num, pharm_num, status, comments, username, porStatus) 
  values (:web_order_id, :web_entry_date, :site_num, :protocol_num, :inv_num, :pharm_num, :status, :comments, :username, :porStatus)

在SQL Server端

     select cast(web_order_id as float) web_order_id, line_id, cast(no_of_participants as float) no_of_participants, cast(amt_inventory as float) amt_inventory, cast(NSC_num as float) NSC_num, cast(dose_str as float) dose_str, dose_unit, dose_form, dose_mult, cast(amt_req as float) amt_req 
     FROM web_ship_detail 
     WHERE web_order_id = ?

最后在Oracle方面

    insert into web_ship_detail (web_order_id, line_id, no_of_participants, amt_inventory, NSC_num, dose_str, dose_unit, dose_form, dose_mult, amt_req) 
     values (:web_order_id, :line_id, :no_of_participants, :amt_inventory, :NSC_num, :dose_str, :dose_unit, :dose_form, :dose_mult, :amt_req)

努力的目的是在整个SSIS包中设计一个最小代码更改的解决方案。

1 个答案:

答案 0 :(得分:2)

我知道您正在寻找最少的代码更改,不确定这些是否合格但会100%解决问题。有3个选项:

  1. 修改MS SQL表并包含" IsTransferred"位列。将已验证的记录移至oracle时,将列更新为1 / true

  2. 跟踪已转移到Oracle的单独订单表。当选择MS SQL命令时,不包括那些新的"转移"表

  3. 使用Oracle& A创建数据流对象。 MS SQL命令表作为源,使用合并连接,使用左外部。使用Oracle列为空的结果(没有匹配的Oracle记录,没有传输)并使用这些记录转移到Oracle。

  4. 不知道双方有多少记录,因此某些选项可能存在性能问题。