Sql 选择联接前的列与联接后的列

Sql 选择联接前的列与联接后的列,sql,amazon-redshift,Sql,Amazon Redshift,我想知道根据性能在连接两个(或十个…)表之前或之后选择相关列是否会有所不同 假设每个表(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

我想知道根据性能在连接两个(或十个…)表之前或之后选择相关列是否会有所不同

假设每个表(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)

性能有差别吗

是的,第二个示例会比较慢,因为您编写了一个子查询,所以执行计划会更长,首先是子查询内部的select要比外部select长。
您正在查询它两次。第一个例子是正确的方法。

任何现代优化器都会将这两个查询视为相同的。因此,为了可读性,请使用第一个

在线示例:

哈希右连接(成本=17.20..31.12行=320宽度=444)
散列条件:(b.col2=a.col1)
->b上的顺序扫描(成本=0.00..13.10行=310宽度=226)
->散列(成本=13.20..13.20行=320宽度=222)
->a上的顺序扫描(成本=0.00..13.20行=320宽度=222)

---------------------------------------------------------------------------
|Id |操作|名称|行|字节|成本(%CPU)|时间|
---------------------------------------------------------------------------
|0 | SELECT语句| 5 | 715 | 6(0)| 00:00:01|
|*1 |散列连接外部| | 5 | 715 | 6(0)| 00:00:01|
|2 |表格访问完整| A | 3 | 195 | 3(0)| 00:00:01|
|3 |表格访问完整| B | 5 | 390 | 3(0)| 00:00:01|
---------------------------------------------------------------------------

-这两个计划实际上略有不同,但总体方法相同

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


MySQL也生成完全相同的计划(DbFiddle不允许我运行explain for MySQL)

id |选择|类型|表格|分区|类型|可能的|键|键|列|参考|行|过滤|额外
---+-------------+-------+------------+------+---------------+-----+---------+-----+------+----------+---------------------------------------------------
1 |简单| A | | | | | | | |所有| | | | 3 | 100 |
1 |简单| B | | | | | | | | | |所有| | | | 5 | 100 |在何处使用;使用联接缓冲区(块嵌套循环)

执行计划告诉您什么?任何数据库管理系统都应该对此进行优化。执行版本1为了保持代码简单,跳过那些子查询。我最后使用了第二个示例,使用了SELECT DISTINCT,这不是因为性能本身,而是因为使用78GB表时,我遇到了一个磁盘错误。我猜这取决于优化器的能力,优化器的速度更快(?),但在我的具体情况下,还存在存储因素。如果对其中一个派生表应用
DISTINCT
,则这是一个完全不同的查询。这意味着您的查询返回重复项,这可能意味着您的连接条件是不完整的(它产生了部分笛卡尔积)。这对于任何现代DBMS来说都是完全错误的-两者都将产生精确的执行计划