【问题标题】:Syntax performance of INNER JOININNER JOIN 的语法性能
【发布时间】:2021-04-01 01:08:53
【问题描述】:

这两个例子的表现是一样的吗?

示例 1:

SELECT t1.wanted_1, t2.wanted_2 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.common_col = t2.common_col

示例 2:

SELECT wanted_1, wanted_2 
FROM 
    (SELECT wanted_1, common_col FROM table1) 
INNER JOIN 
    (SELECT wanted_2, common_col FROM table_2) USING(common_col)

我目前正在使用示例 #2,因为我要加入 15 个以上的表,每个表都有许多不必要的列和许多行(100 万以上)

【问题讨论】:

  • 您为什么不运行这两个查询并自己衡量它们的性能??

标签: sql oracle performance optimization


【解决方案1】:

Oracle 足够聪明并且不会从表 1 中获取所有列并将它们与表 2 中的所有列连接起来,并且只在结果中显示您需要的少数列(你可能害怕什么)

要查看它,请使用explain plan 的查询

EXPLAIN PLAN  SET STATEMENT_ID = 'jara1' into   plan_table  FOR   
SELECT t1.wanted_1, t2.wanted_2 FROM table1 t1 INNER JOIN table2 t2 ON t1.common_col=t2.common_col
;

SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', 'jara1','ALL'))

你得到这个结果

-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    52 |     5  (20)| 00:00:01 |
|*  1 |  HASH JOIN         |        |     1 |    52 |     5  (20)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| TABLE1 |     1 |    26 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| TABLE2 |     1 |    26 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------
 
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
 
   1 - SEL$58A6D7F6
   2 - SEL$58A6D7F6 / T1@SEL$1
   3 - SEL$58A6D7F6 / T2@SEL$1
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("T1"."COMMON_COL"="T2"."COMMON_COL")
 
Column Projection Information (identified by operation id):
-----------------------------------------------------------
 
   1 - (#keys=1) "T1"."WANTED_1"[NUMBER,22], "T2"."WANTED_2"[NUMBER,22]
   2 - "T1"."WANTED_1"[NUMBER,22], "T1"."COMMON_COL"[NUMBER,22]
   3 - "T2"."WANTED_2"[NUMBER,22], "T2"."COMMON_COL"[NUMBER,22]

最重要的信息是column projection 部分,您可以在其中看到只考虑引用的列。

您还可以检查第二个查询的执行计划,看看除了一些小细节之外,您会得到相同的结果。

因此,IMO 的结果是,尽管可读性较差的查询,您在使用查询 2 时不会看到任何显着差异

你自己的测试应该确认它。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多