SQL性能:在连接或直接连接中进行子选择?

时间:2013-10-23 06:52:33

标签: sql performance oracle join

我对下表<\ / p>的表现有疑问

表A - 只有5个客户ID(5行1列) 表B - 是所有客户及其信息的主基础(1百万行和500列)

查询1: -

Select A.*,
       B.Age
from A
left join B
on A.Customer_id = B.Customer_id;

查询2: -

Select a.*,
       B.Age
from A
left join
(select Customer_id,age from B) C
on A.Customer_id = C.Customer_id;

这里的主要性能问题是因为表B中存在500列。 我觉得第二个查询更好,因为SQL在连接期间不必创建临时表,包含表B中的所有列。

如果这是错误的,请告诉我?

4 个答案:

答案 0 :(得分:1)

  

我觉得第二个查询更好,因为SQL在连接期间不必创建临时表,包含表B中的所有列。

您可以判断Oracle是否在执行期间创建临时表,或者是否从解释计划中创建临时表。您还应该考虑Oracle内核开发人员是否存在这样一个明显的性能问题(如果它存在的话)。

碰巧,没有临时表,你的第一个查询没有任何问题。由于性能原因,几乎从不需要操作查询 - 编写查询,这是您所需逻辑的最佳封装。

答案 1 :(得分:0)

CREATE INDEX index_name ON table_b (customer_id)

然后使用

Select a.*,
       B.Age 
from A 
left join (select Customer_id,
                  age 
           from B) C 
        on A.Customer_id = C.Customer_id;

答案 2 :(得分:0)

500列相当广泛。

也许你可以创建一个像:

这样的索引
CREATE INDEX index_name 
          ON table_b (customer_id, 
                      age
                     );

答案 3 :(得分:0)

select中的子查询比使用join 更快(无论是直接连接还是子选择)

select 
   a.*,
   (select b.age 
    from b
    where b.customer_id = a.customer_id)
from a

请注意:

  • 它的行为类似于外连接(如果a中的customer_id不存在,则返回年龄中的空字段)
  • 子查询应该从a每行b返回一行。