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

Oracle 使用长时间运行的列表内更新

askTom 2018-01-31
162

问题描述

你好,



我对ORacle SQL相当陌生,并停留在某一时刻。

我正在尝试在每日事实表上运行以下update语句,并且它一直在运行。有没有办法优化下面的sql,我需要做任何预处理或添加任何idex?

还是在substr函数上使用如此长的列表中是错误的

UPDATE EDI_867_DLY_FACT a SET OVRD_CUST_CD = 3000, audt_upd_dt=sysdate
WHERE (EDI_SNDR_ID, CUST_CD) IN (SELECT SNDR_ID, SOLD_TO FROM EDI_RULE_SNDR WHERE RULE_KEY= 1)
AND SUBSTR(POC_ZIP_CD,1,3) IN ('500','501','502','503','504','505','506','507','511','513','514','515','520','522','523','524','525','526','527','528','620','622','628','630','631','633','634','635','636','640','641','644','645','647','648','650','651','652','653','654','655','656','657','658','660','661','662','665','666','667','668','670','671','672','673','674','675','676','678','679','680','681','684','685','686','687','688','689','716','717','719','720','721','722','725','726','728','740','741','743','744')
AND OVRD_INV_DT='23-SEP-16'
复制


感谢您的所有帮助!提前感谢

专家解答

为了帮助SQL性能,我们确实需要查看执行计划。这包含查询的详细信息。

您可以生成一个如下所示:

set serveroutput off
update /*+ gather_plan_statistics */

select * 
from   table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
复制


您可以找到其他方法来做到这一点,并在以下位置阅读有关计划的更多信息:https://blogs.oracle.com/sql/how-to-create-an-execution-plan

do i need to do any preprocessing or add any index?

索引可能会有所帮助,但我们确实需要查看解决该问题的计划。

Or is it just wrong to use such a long in-list on a substr function

列表中是一系列or的简写。一个大的列表 (可能) 意味着你正在访问更多的行,这反过来使一个索引不太有用。

Substr本身不是问题。但是通常您需要创建一个索引,该索引完全包含substr,就像您在查询中使用它一样。

在以下位置阅读有关索引的更多信息:

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

评论