加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – IN子句如何影响oracle的性能?

发布时间:2020-12-12 06:54:10 所属栏目:MsSql教程 来源:网络整理
导读:UPDATE table1 SET col1 = 'Y' WHERE col2 in (select col2 from table2) 在上面的查询中,假设内部查询返回10000行.带有IN子句的查询是否会影响性能? 如果是这样,可以做些什么来加快执行速度? 解决方法 如果子查询与TABLE1中的行数相比返回大量行,则优化器
UPDATE table1 
       SET col1 = 'Y'
     WHERE col2 in (select col2 from table2)

在上面的查询中,假设内部查询返回10000行.带有IN子句的查询是否会影响性能?

如果是这样,可以做些什么来加快执行速度?

解决方法

如果子查询与TABLE1中的行数相比返回大量行,则优化器可能会生成如下计划:
--------------------------------------------------------------------------------
| Id  | Operation           | Name   | Rows  | Bytes |TempSpc| Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT    |        |   300K|    24M|       |  1581   (1)| 00:0
|   1 |  UPDATE             | TABLE1 |       |       |       |            |
|*  2 |   HASH JOIN SEMI    |        |   300K|    24M|  9384K|  1581   (1)| 00:0
|   3 |    TABLE ACCESS FULL| TABLE1 |   300K|  5860K|       |   355   (2)| 00:0
|   4 |    TABLE ACCESS FULL| TABLE2 |   168K|    10M|       |   144   (2)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("COL2"="COL2")

它将扫描两个表并仅更新两个表共有的TABLE1中的行.如果您需要更新大量行,这是一个高效的计划.

有时,与TABLE1中的行数相比,内部查询将具有很少的行.如果TABLE1(col2)上有索引,则可以获得与此类似的计划:

-------------------------------------------------------------------------------
| Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT     |        |    93 |  4557 |   247   (1)| 00:00:03 |
|   1 |  UPDATE              | TABLE1 |       |       |            |          |
|   2 |   NESTED LOOPS       |        |    93 |  4557 |   247   (1)| 00:00:03 |
|   3 |    SORT UNIQUE       |        |    51 |  1326 |   142   (0)| 00:00:02 |
|   4 |     TABLE ACCESS FULL| TABLE2 |    51 |  1326 |   142   (0)| 00:00:02 |
|*  5 |    INDEX RANGE SCAN  | IDX1   |     2 |    46 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - access("T1"."COL2"="T2"."COL2")

在这种情况下,Oracle将读取TABLE2中的行,并为每个(唯一)行执行对TABLE1的索引访问.

哪个访问更快取决于内部查询的选择性和TABLE1上索引的聚类(TABLE1中col2值相似的行是彼此相邻还是随机扩展?).在任何情况下,性能方面,如果您需要执行此更新,此查询是最快的方法之一.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读