Oracle 数据库 SQL效率问题,下面语句的结果一样吗?如果一样哪个效率更高?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 数据库 SQL效率问题,下面语句的结果一样吗?如果一样哪个效率更高?相关的知识,希望对你有一定的参考价值。
语句一:
select t.a, t.b, t.c, s.b as b_new
from table_1 t
left join table_2
on t.a = s.a
语句二:
select t.a, t.b, t.c,
(select s.b from table_2 s where t.a = s.a) as b_new
from table_1 t
谢谢
语句一 table_2处少打个s 不奥纠结这些小错误,主要是关联的样式
可能第一个效率可能会高一些, t1 和 t2 做了一次连接。
第二个,则对 t2 检索了多次
但实际上 差别 可能 微乎其微。
关键看你对连接列有没有建立索引,以及数据量的大小 参考技术A 第一种效率高
第一种只进行一次左连接操作。
第二种对t表的每一行,都要在s表内再检索一次
不过数据量小的话执行时间上看不出来差别 参考技术B 第一个高。
你可以做测试表。插入10W条数据测试耗时。
Oracle sql语句 minus函数执行效率与join对比
我们经常会对select结果进行对比,常用的函数如minus, 那么当两张表数据量较大时,有什么方式可以提高效率呢?
minus 方式
minus 执行计划如下所示, 通过排序后再进行对比
select object_id from t2 minus select object_id from t1;
..
2255 rows selected.
Elapsed: 00:00:00.93
Execution Plan
Plan hash value: 1578327006
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 102K| 2357K| | 1318 (1)| 00:00:16 |
| 1 | MINUS | | | | | | |
| 2 | SORT UNIQUE | | 102K| 1304K| 2024K| 861 (1)| 00:00:11 |
| 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |
| 4 | SORT UNIQUE | | 82926 | 1052K| 1640K| 457 (1)| 00:00:06 |
| 5 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |
Note
- dynamic sampling used for this statement (level=2)
Statistics
9 recursive calls --递归
0 db block gets
1681 consistent gets
1798 physical reads
0 redo size
41734 bytes sent via SQL*Net to client
2173 bytes received via SQL*Net from client
152 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
2255 rows processed
使用join方式替代
尤其数据量越大的情况下,join方式,不排序,走的hash算法,执行游戏效率会更好
alter system flush buffer cache;
select t2.object_id t2_id from t1 right join t2 on t1.object_id=t2.object_id where t1.object_id is null;
2255 rows selected.
Elapsed: 00:00:00.56
Execution Plan
Plan hash value: 4276371593
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 102K| 2609K| | 653 (1)| 00:00:08 |
|* 1 | HASH JOIN RIGHT ANTI | | 102K| 2609K| 2032K| 653 (1)| 00:00:08 |
| 2 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |
Predicate Information (identified by operation id):
1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note
- dynamic sampling used for this statement (level=2)
Statistics
0 recursive calls --没有递归游戏调用
0 db block gets
1692 consistent gets
1534 physical reads
0 redo size
41730 bytes sent via SQL*Net to client
2173 bytes received via SQL*Net from client
152 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2255 rows processed
以上是关于Oracle 数据库 SQL效率问题,下面语句的结果一样吗?如果一样哪个效率更高?的主要内容,如果未能解决你的问题,请参考以下文章