2013-10-23 51 views
1

我有在下面表的性能\SQL性能:在连接或直接连接中选择?

表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的所有列的连接期间创建临时表。

请让我知道这是错误的吗?

+0

使用所需列上的索引使查询运行更快 –

+0

执行计划会告诉您哪一个更好。 –

+0

我如何查看执行计划? –

回答

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; 
+0

为什么从B中选择内联视图? –

+0

这是通过删除连接操作并将多个单独查询集中到单个查询中来简化复杂查询? –

+0

我没有看到过刚刚加盟到“B”一个好处,在这种情况下,虽然 –

0

500列是相当广泛的。

也许你可以创建像一个指标:

CREATE INDEX index_name 
      ON table_b (customer_id, 
         age 
        ); 
1

我觉得第二个查询是SQL更好不会有在加入含有从表B中的所有列创建临时表

您可以判断Oracle是否在执行过程中创建临时表,还是从解释计划中创建临时表。你还应该考虑一下,如果Oracle内核开发者存在,是否会遇到这样一个明显的性能问题。

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

+0

你能告诉哪个查询速度更快,为什么(选择上面显示的2之间的一个)? –

+0

它们可能执行完全相同,因为查询优化器将通过称为视图合并的机制将第二个查询转换为第一个查询。 –

+0

你可以给我一些链接,了解查询优化器和视图合并? –

0

子查询比使用加入更快(无论直接连接或子选择)

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

注:

  • 它像外连接(在返回空场年龄,如果来自b的customer_id不存在于a)
  • 子查询应该只从a的每行b中返回一行。
+0

我想看到一些证据断言“select中的子查询比使用join更快”。过去它通常意味着排除某些连接方法,并可能导致性能问题。恐怕我不相信这是真的。 –