问题描述
我们需要为手头的计数运行一个非常大的进口。我们正在更新的表 -- 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三次:
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子句中引用它们。例如:
当您说要分批运行500,000时,我有点担心。您是否正在循环浏览50万个商店和产品id,调用每个id的合并?
如果是这样,这几乎肯定需要很长时间。只需将您的查询放在using子句中查找所有产品,商店和数量即可。例如:
如果要合并特定存储和代码的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。