问题描述
你好,汤姆,
需要您对在UPDATE语句中加入多个表的反馈
场景: 我想根据表 'd' 中的引用/键值更新表 'a' 的列值。下面是我的查询。它对少量记录有好处。但是当涉及到记录的lacs时,查询只会暂停很长时间。是否还有其他编写此查询的方法。
提前谢谢。
需要您对在UPDATE语句中加入多个表的反馈
场景: 我想根据表 'd' 中的引用/键值更新表 'a' 的列值。下面是我的查询。它对少量记录有好处。但是当涉及到记录的lacs时,查询只会暂停很长时间。是否还有其他编写此查询的方法。
update (select a.category as defaultcategory from a left join b on b.xx_id = a.xx_id left join c on c.zz_id = b.zz_id left join d on d.yy_id = c.yy_id where d.yy_id = ‘123’) dc set dc.defaultcategory = (select kk_id from cc where name = 'NNN')
提前谢谢。
专家解答
'\ _(ツ)_/''
可能有。但是我们需要更多细节!
具体请包括:
-为您的所有表创建表语句。确保这包括这些表上的任何约束和索引!
-更新的执行计划
您可以通过在查询中添加gather_plan_statistics提示来获得此信息。然后调用DBMS_Xplan.display_cursor。就像这样:
确保您发送给我们的计划包括那些E行,A行和缓冲区列。
一个观察结果:
你所有的联接都是外部联接。但是你在D上有一个where子句。所以这些是内部连接。让他们这样!
可能有。但是我们需要更多细节!
具体请包括:
-为您的所有表创建表语句。确保这包括这些表上的任何约束和索引!
-更新的执行计划
您可以通过在查询中添加gather_plan_statistics提示来获得此信息。然后调用DBMS_Xplan.display_cursor。就像这样:
set serveroutput off
update /*+ gather_plan_statistics */t
set x = x + 1;
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
SQL_ID g4ya70274azsu, child number 0
-------------------------------------
update /*+ gather_plan_statistics */t set x = x + 1
Plan hash value: 4095874790
-------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | | 0 |00:00:00.01 | 10 |
| 1 | UPDATE | T | 1 | | 0 |00:00:00.01 | 10 |
| 2 | TABLE ACCESS FULL| T | 1 | 1 | 1 |00:00:00.01 | 7 |
------------------------------------------------------------------------------------- 确保您发送给我们的计划包括那些E行,A行和缓冲区列。
一个观察结果:
你所有的联接都是外部联接。但是你在D上有一个where子句。所以这些是内部连接。让他们这样!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




