选择连接前与连接后的列

婴儿床

我想知道在基于性能连接两个(或十个...)表之前或之后选择相关列是否有所不同。

假设每个表(A / B)最初有20-30列。

范例1:

SELECT A.col1, A.col2, B.col3, B.col4
FROM A
LEFT JOIN B ON B.col2 = A.col2

范例2:

SELECT A.col1, A.col2, B.col3, B.col4
FROM (SELECT col1, col2 FROM A) A
LEFT JOIN (SELECT col2, col3, col4 FROM B) B ON (B.col2 = A.col2)

性能上有区别吗?

a_horse_with_no_name

任何现代优化器都将两个查询视为相同。因此,为了便于阅读,请使用第一个。

在线示例:

Postgres

Hash Right Join  (cost=17.20..31.12 rows=320 width=444)
  Hash Cond: (b.col2 = a.col1)
  ->  Seq Scan on b  (cost=0.00..13.10 rows=310 width=226)
  ->  Hash  (cost=13.20..13.20 rows=320 width=222)
        ->  Seq Scan on a  (cost=0.00..13.20 rows=320 width=222)

甲骨文

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     5 |   715 |     6   (0)| 00:00:01 |
|*  1 |  HASH JOIN OUTER   |      |     5 |   715 |     6   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| A    |     3 |   195 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| B    |     5 |   390 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

SQL Server-这两个计划实际上略有不同,但一般方法是相同的

在此处输入图片说明

在此处输入图片说明

不知道那里的“计算标量”在做什么(我对SQL Server的经验非常有限),但是花费似乎表明它并没有真正改变任何东西。


MySQL还生成完全相同的计划(DbFiddle不会让我为MySQL运行说明)

id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra                                             
---+-------------+-------+------------+------+---------------+-----+---------+-----+------+----------+---------------------------------------------------
 1 | SIMPLE      | A     |            | ALL  |               |     |         |     |    3 |      100 |                                                   
 1 | SIMPLE      | B     |            | ALL  |               |     |         |     |    5 |      100 | Using where; Using join buffer (Block Nested Loop)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章