暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 解决代理键时的大型更新

askTom 2017-04-11
290

问题描述

我们需要为手头的计数运行一个非常大的进口。我们正在更新的表 -- PRODUCT_STORE -- 由store_id和product_id键入。但是,product_id是一个代理键,我们得到了product_code和store_id,我们需要解析product_id才能执行SQL语句。

因为该行可以是更新或插入,所以我们正在生成一批准备执行合并操作的语句。但是,我需要在语句中解析product_id三次:

1.作为合并本身的一部分,以确定匹配或不匹配
2.作为不匹配子句中插入的一部分
3.作为不匹配指令中的WHERE子句的一部分,以确保我们不会尝试将不良数据插入表中 (换句话说,如果我们无法解析product_id,请跳过它)。

可以通过查询来解析product_id -- 从STORE_PRODUCT中选择PRODUCT_ID,其中STORE_ID =?和PRODUCT_CD =?

所以这使我的合并语句像这样:

使用DUAL ON合并到STORE_INVENTORY
(PRODUCT_ID = (从STORE_PRODUCT中选择PRODUCT_ID,其中STORE_ID =?和PRODUCT_CD =?) 和STORE_ID =?)
不匹配时,插入 (STORE_ID,PRODUCT_ID,AVAILABLE_QTY)
值 (?,(从STORE_PRODUCT中选择PRODUCT_ID,其中SYSTEM_ID =?和PRODUCT_CD =?),?)
哪里 (从STORE_PRODUCT中选择PRODUCT_ID,其中STORE_ID =?和PRODUCT_CD =?)不为NULL
匹配时,更新集可用数量 =?

这似乎工作正常; 我担心的是,由于我在一个语句中运行相同的子查询三次,并且由于将有数百万行要处理 (尽管我正在批量500,000中运行它们),我想知道是否有更有效的方法来做到这一点?

谢谢!

专家解答

我不确定我完全理解你在做什么。但感觉你错过了合并的点。

如果要合并特定存储和代码的product_id,请在using子句中的子查询中选择它们。然后,您将获得 “有效” product_id,并可以在update/insert子句中引用它们。例如:

merge into store_inventory i using 
  ( select product_id from store_product 
    where store_id = ? and product_cd = ? 
  ) p
on ( i.product_id = p.product_id )
when not matched then
  insert ( store_id,product_id,available_qty )
  values ( ?, p.product_id, ? )
when matched then
  update set available_qty=?
复制


当您说要分批运行500,000时,我有点担心。您是否正在循环浏览50万个商店和产品id,调用每个id的合并?

如果是这样,这几乎肯定需要很长时间。只需将您的查询放在using子句中查找所有产品,商店和数量即可。例如:

merge into store_inventory i using 
  ( select store_id, product_id,available_qty from store_product 
    where store_id is not null and product_cd is not null
  ) p
on ( i.product_id = p.product_id
when not matched then
  insert ( store_id,product_id,available_qty )
  values ( p.store_id, p.product_id, p.available_qty )
when matched then
  update set available_qty=p.available_qty
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论