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