1

我对下表的性能有疑问\

表 A -- 只有 5 个客户 ID(5 行 1 列) 表 B -- 是所有客户及其信息的主库。(100 万行和 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

4 回答 4

1

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

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

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

于 2013-10-23T07:24:05.817 回答
0

500 列相当广泛。

也许您可以创建一个索引,例如:

CREATE INDEX index_name 
          ON table_b (customer_id, 
                      age
                     );
于 2013-10-23T07:15:08.100 回答
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;
于 2013-10-23T07:03:43.993 回答
0

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

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

笔记:

  • 它的行为类似于外部联接(如果 a 中不存在来自 b 的 customer_id,则返回年龄中的空字段)
  • 子查询应该从 a 中的每行只返回来自 b 的一行。
于 2013-10-23T09:09:08.510 回答