update語句的優化方式
有二張表,表中資料如下所示:
SQL> select * from a;
ID COL1 COL2
---------- --------------- ---------------
1 test1 remark1
2 test2 remark2
3 test3 remark3
4 test4 remark4
SQL> select * from b;
ID COLD1 COLD2
---------- --------------- ---------------
1 B2 remark3
2 C1 remark2
3 B4 remark3
現要通過欄位id關聯,將表a中的col2欄位更新為B中對應的cold2值。
SQL> set autotrace on;
方式一:傳統的update語句,a,b表直接通過id關聯
SQL> edit
已寫入 file afiedt.buf
1 update a set a.col2=(
2 select b.cold2 from b
3 where a.id=b.id)
4 where exists(
5 select 1 from b
6* where a.id=b.id)
SQL> /
已更新3行。
執行計劃
----------------------------------------------------------
Plan hash value: 2449172722
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 3 | 105 | 7 (15)| 00:00:01 |
| 1 | UPDATE | A | | | | |
|* 2 | HASH JOIN SEMI | | 3 | 105 | 7 (15)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 4 | 88 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| B | 3 | 39 | 3 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | B | 1 | 22 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."ID"="B"."ID")
5 - filter("B"."ID"=:B1)
Note
-----
- dynamic sampling used for this statement
統計資訊
----------------------------------------------------------
10 recursive calls
5 db block gets
62 consistent gets
0 physical reads
0 redo size
909 bytes sent via SQL*Net to client
1025 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> rollback;
回退已完成。
方式二:merge 更新方式,通過分析計劃資料可知,merge更新要快於方式一
SQL> merge into a
2 using b
3 on(a.id=b.id)
4 when matched then update set a.col2=b.cold2;
3 行已合併。
執行計劃
----------------------------------------------------------
Plan hash value: 1518874097
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | MERGE STATEMENT | | 3 | 54 | 7 (15)| 00:00:01 |
| 1 | MERGE | A | | | | |
| 2 | VIEW | | | | | |
|* 3 | HASH JOIN | | 3 | 222 | 7 (15)| 00:00:01 |
| 4 | TABLE ACCESS FULL| B | 3 | 93 | 3 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL| A | 4 | 172 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."ID"="B"."ID")
Note
-----
- dynamic sampling used for this statement
統計資訊
----------------------------------------------------------
36 recursive calls
5 db block gets
49 consistent gets
0 physical reads
0 redo size
910 bytes sent via SQL*Net to client
990 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
3 rows processed
方式三:inline view 更新方式
SQL> update
2 (select a.col2,b.cold2 from a,b where a.id=b.id)
3 set col2=cold2;
set col2=cold2
*
第 3 行出現錯誤:
ORA-01779: 無法修改與非鍵值儲存表對應的列
注:關聯表B的id必須是主鍵。
SQL> alter table b add constraint pk_b primary key(id);
表已更改。
SQL> edit
已寫入 file afiedt.buf
1 update
2 (select a.col2,b.cold2 from a,b where a.id=b.id)
3* set col2=cold2
SQL> /
已更新3行。
執行計劃
----------------------------------------------------------
Plan hash value: 996040790
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
| 0 | UPDATE STATEMENT | | 3 | 132 | 6 (17)| 00:0
0:01 |
| 1 | UPDATE | A | | | |
|
| 2 | MERGE JOIN | | 3 | 132 | 6 (17)| 00:0
0:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| B | 3 | 66 | 2 (0)| 00:0
0:01 |
| 4 | INDEX FULL SCAN | PK_B | 3 | | 1 (0)| 00:0
0:01 |
|* 5 | SORT JOIN | | 4 | 88 | 4 (25)| 00:0
0:01 |
| 6 | TABLE ACCESS FULL | A | 4 | 88 | 3 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("A"."ID"="B"."ID")
filter("A"."ID"="B"."ID")
Note
-----
- dynamic sampling used for this statement
統計資訊
----------------------------------------------------------
198 recursive calls
5 db block gets
57 consistent gets
0 physical reads
0 redo size
910 bytes sent via SQL*Net to client
982 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
10 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> rollback;
回退已完成。
三、結論
標準update語法
單表更新或較簡單的語句採用使用此方案更優。
inline view更新法
兩表關聯且被更新表通過關聯表主鍵關聯的,採用此方案更優。
merge更新法
兩表關聯且被更新表不是通過關聯表主鍵關聯的,採用此方案更優。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21251711/viewspace-1102660/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一條update語句的優化探索優化
- SQL語句的優化SQL優化
- javascript對於if條件語句程式碼的優化方式JavaScript優化
- SQL語句優化SQL優化
- SQL 語句的優化方法SQL優化
- MySQL的update語句避坑MySql
- MYSQL SQL語句優化MySql優化
- MySQL——優化ORDER BY語句MySql優化
- sql語句效能優化SQL優化
- mysql limit語句優化MySqlMIT優化
- 求助:SQL語句優化SQL優化
- mysql 優化常用語句MySql優化
- 優化 SQL 語句的步驟優化SQL
- mysql 語句的索引和優化MySql索引優化
- 一個SQL語句的優化SQL優化
- 關於sql語句的優化SQL優化
- 一條sql語句的優化SQL優化
- sql語句的優化案例分析SQL優化
- SQL Server優化之SQL語句優化SQLServer優化
- 【SQL】10 SQL UPDATE 語句SQL
- Sql Server系列:Update語句SQLServer
- FORALL執行UPDATE語句
- SQL update select語句SQL
- MySQL之SQL語句優化MySql優化
- SQL語句優化(轉載)SQL優化
- 常用SQL語句優化技巧SQL優化
- Oracle之sql語句優化OracleSQL優化
- 效能優化查詢語句優化
- MySQL系列6 - join語句的優化MySql優化
- 對sql語句的優化問題SQL優化
- 優化SQL 語句 in 和not in 的替代方案優化SQL
- MySQL -update語句流程總結MySql
- ORACLE多表關聯UPDATE語句Oracle
- ORACLE多表關聯UPDATE 語句Oracle
- MySql與Sql Server Update語句MySqlServer
- FORALL執行UPDATE語句(二)
- ORACLE UPDATE 語句語法與效能分析Oracle
- oracle update語句的幾點寫法Oracle