Sql Oracle查询优化

Sql Oracle查询优化,sql,oracle,Sql,Oracle,我对此查询有问题,需要5分钟以上才能完成。 你能帮我增强一下索引,增强一下查询。。。 只有当第二部分至少包含一行时,查询的第一部分才会进行更新。 我使用Exists来检查此条件。首先,您应该清理查询。可更新记录必须与hasalternativecode$type_='Issuer'和accesspoint_=10匹配与EXISTS子句或SET子查询无关。这是表本身的标准,属于WHERE子句 那么:我猜想GROUPBY条款是一项安全措施?您希望每个标识符和提供程序都有一条记录,否则希望出现异常?如

我对此查询有问题,需要5分钟以上才能完成。 你能帮我增强一下索引,增强一下查询。。。 只有当第二部分至少包含一行时,查询的第一部分才会进行更新。
我使用Exists来检查此条件。

首先,您应该清理查询。可更新记录必须与hasalternativecode$type_='Issuer'和accesspoint_=10匹配与EXISTS子句或SET子查询无关。这是表本身的标准,属于WHERE子句

那么:我猜想GROUPBY条款是一项安全措施?您希望每个标识符和提供程序都有一条记录,否则希望出现异常?如果情况并非如此,则删除GROUPBY子句,因为子查询必须只返回一条记录,或者根本不返回任何记录,不能再返回更多记录

至于优化:只有在表结构已知时才能进行优化。这包括定义主键、外键、类型、非空列等,以及每个表的记录数;我们在表中查找“发卡机构”记录的频率,访问点10的频率;这两者的结合频率是多少?。然后,在dbms执行计划的帮助下,可以考虑如何进行优化

首先:想想每个表有多少条记录是相关的。接入点为10的“发行人”有多少?如果这些记录非常少,比如说占所有记录的2%,那么索引就很有用了。在这种情况下:两列上都有索引吗?如果没有,创建一个。然后转到fi_tradableasset:您希望有多少记录具有查找代码?再说一次:只有2%?那么:是否有关于金融机构可交易资产的指数?发行人$code?等等


最后:如果必须读取整个表,您可以始终使用并行提示,例如UPDATE/*+parallelprc\u alternativecode\u4*/prc\u alternativecode\u4。。。。根据机器和ist的使用情况,这可以极大地加快此类语句的速度。

如果我是您,我会将其转换为合并语句,以便删除UPDATE语句的EXISTS子句所需的对表的额外访问。比如:

merge into table_tgt tgt
using (SELECT   t.issuer$code_,
                a.dateandtime_,
                a.mainentityid_,
                '10' accesspoint_,
                MAX (b.updatoruserid_) updatoruserid_,
                '1423566734151' updatedate_,
                b.provider_ provider$code_,
                'Issuer' || MAX (b.provider_) || MAX (b.identifier_) unicity_,
                MAX (cs.pk_) provider$pk_,
                'false' locked_,
                b.identifier_ alternativecode_
       FROM     table_a a,
                table_b b,
                table_cs cs,
                table_t t
       WHERE    a.accesspoint_ = 100
       AND      a.pk_ = b.cialinstrumentnotification$pk_
       AND      b.provider_ = cs.identifier_ (+)
       AND      b.entitytype_ = 'Issuer'
       AND      a.identifier_ = t.identifier_
       GROUP BY t.issuer$code_,
                a.dateandtime_,
                b.identifier_,
                b.provider_,
                a.mainentityid_)
  on (src.issuer$code_ = tgt.hasalternativecode$code_
      and (tgt.alternativecode_ != src.alternativecode_
           OR tgt.provider$code_ != src.provider$code_)
      AND src.dateandtime_ >= tgt.updatedate_
      and tgt.mainentityid_ = src.mainentityid_)
when matched then
update set tgt.accesspoint_ = src.accesspoint_,
           tgt.updatoruserid_ = src.updatoruserid_,
           tgt.updatedate_ = src.updatedate_,
           tgt.provider$code_ = src.provider$code_,
           tgt.unicity_ = src.unicity_,
           tgt.provider$pk_ = src.provider$pk_,
           tgt.locked_ = src.locked_,
           tgt.alternativecode_ = src.alternativecode_
where      tgt.hasalternativecode$type_ = 'Issuer'
and        tgt.accesspoint_ = 10;

注意:完全没有经过测试,所以你应该进行测试,确保得到正确的结果。我已经删除了GROUPBY子句中出现的两列周围不必要的MAX。我还将ent_codicationsource_uu表上的连接转换为外部连接

请向我们展示此查询的ORACLE执行计划,以了解发生了什么。我想感谢您的回答,您的意思是我应该删除exists条件,并且应该在主体部分的where子句中添加条件?否。删除prc_alternativecode_uu。hasalternativecode$type_u='Issuer'和prc_alternativecode_uu.accesspoint_u10,从exists子句和SET子查询中删除。相反,将它们放在WHERE子句中:WHERE具有AlternativeCode$type_='Issuer'和accesspoint_='10并且存在……谢谢,但我无法更新On子句updateDate_'SQL错误:ORA-38104:On子句中引用的列无法更新:TGT.updateDate_38104。00000-无法更新ON子句中引用的列:%s*原因:更新集的LHS包含ON子句*操作:'中引用的列