oraclesql中如何更新多行
基表1
交易表
我想根据我的基表 1 更新我的事务表 Brcode。你能帮我解决这个问题吗?
update trans tl
set brcode = (
select brcode
from basetbl tlb
where tl.accountno=tlb.accountno
);
这个查询需要很长时间。
最终输出
回答
该查询基本上执行 subselect 的次数与trans表中的行数一样多。更好的方法是使用MEGRE语句。
比较计划,列starts包含执行次数。索引basetbl.accountno将提高性能,但哈希连接看起来更适合此任务,因为trans表中有大量行。
| PLAN_TABLE_OUTPUT |
| :------------------------------------------------- ------------------------------- |
| 解释的 SQL 语句: |
| ------------------------ |
| 更新 /*+ GATHER_PLAN_STATISTICS*/ trans tl set brcode = ( select |
| 来自 basetbl tlb 的 brcode 其中 tl.accountno=tlb.accountno ) |
| |
| 计划哈希值:2300756728 |
| |
| -------------------------------------------------- ------------------------------- |
| | 身份证 | 操作 | 姓名 | 开始 | 电子行 | A行 | 时代 | 缓冲器 | |
| -------------------------------------------------- ------------------------------- |
| | 0 | 更新声明 | | 1 | | 0 |00:00:00.01 | 403 | |
| | 1 | 更新 | 反式 | 1 | | 0 |00:00:00.01 | 403 | |
| | 2 | 表访问已满| 反式 | 1 | 99 | 99 |00:00:00.01 | 3 | |
| |* 3 | 表访问已满| 基地 | 99 | 1 | 9 |00:00:00.01 | 第297话 |
| -------------------------------------------------- ------------------------------- |
| |
| 谓词信息(由操作 ID 标识):|
| -------------------------------------------------- - |
| |
| 3 - filter("TLB"."ACCOUNTNO"=:B1) |
| |
| 注意 |
| ----- |
| - 用于此语句的动态采样(级别 = 2) |
| |
| PLAN_TABLE_OUTPUT |
| :------------------------------------------------- ---------------------------------------- |
| 解释的 SQL 语句: |
| ------------------------ |
| 使用 basetbl 将 /*+ GATHER_PLAN_STATISTICS*/ 合并到 trans t ( |
| t.accountno = s.accountno ) 匹配时更新设置 brcode = |
| s.brcode |
| |
| 计划哈希值:4181434565 |
| |
| -------------------------------------------------- ---------------------------------------- |
| | 身份证 | 操作 | 姓名 | 开始 | 电子行 | A行 | 时代 | 缓冲器 | |
| -------------------------------------------------- ---------------------------------------- |
| | 0 | 合并声明 | | 1 | | 0 |00:00:00.01 | 15 | |
| | 1 | 合并 | 反式 | 1 | | 0 |00:00:00.01 | 15 | |
| | 2 | 查看 | | 1 | | 9 |00:00:00.01 | 6 | |
| |* 3 | 哈希连接 | | 1 | 9 | 9 |00:00:00.01 | 6 | |
| | 4 | 表访问已满| 基地 | 1 | 9 | 9 |00:00:00.01 | 3 | |
| | 5 | 表访问已满| 反式 | 1 | 99 | 99 |00:00:00.01 | 3 | |
| -------------------------------------------------- ---------------------------------------- |
| |
| 谓词信息(由操作 ID 标识):|
| -------------------------------------------------- - |
| |
| 3 - access("T"."ACCOUNTNO"="S"."ACCOUNTNO") |
| |
| 注意 |
| ----- |
| - 用于此语句的动态采样(级别 = 2) |
| |
db<>在这里摆弄