gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:05:39 26 4
gpt4 key购买 nike

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 的行彼此相邻还是随机分布?)。在任何情况下,性能方面,如果您需要执行此更新,此查询是执行此操作的最快方法之一。

关于sql - IN 子句如何影响 oracle 中的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com