使用SQL在三个表上进行高效的内连接

时间:2015-03-05 05:43:10

标签: sql oracle join

我需要在两个条件下加入三个表,还需要在使用sql的地方加入。  像

这样的东西
select
    t1.id,t1.name,t2.date,t3.hhh 
from t1 
inner join t2 
    on t1.id = t2.id
inner join t3 
    on t1.name = t3.name
where t1.id = 'gggg'

有没有一种有效的方法可以做到这一点?

两行结果需要.492秒。 我需要尽量减少时间。

2 个答案:

答案 0 :(得分:0)

你可以试试SQL的左连接版本:

SELECT
    t1.id,
    t1.name,
    t2.date,
    t3.hhh
FROM t1 
LEFT JOIN t2  ON t1.id = t2.id
LEFT JOIN t3  ON t1.name = t3.name
WHERE t1.id = 'gggg';

您还需要在PRIMARY KEYS(唯一)和名称,日期等上创建索引以便快速搜索。

e.g。

CREATE UNIQUE INDEX t1_unique_index_id ON t1(id);
CREATE INDEX idx_t1_name ON t1(NAME);

CREATE INDEX t2_unique_index_date ON t2(date);
CREATE INDEX t3_unique_index_hh ON t3(hhh);

答案 1 :(得分:0)

如果您不提供解释计划(最好的选择是获得良好的回复),请检查列是否已编入索引。如果他们不是,以下内容应该有所帮助。

CREATE INDEX t1_idx1 ON t1 (id,name);
CREATE INDEX t1_idx2 ON t1 (name,id);
CREATE INDEX t2_idx1 ON t2 (id,date);
CREATE INDEX t3_idx1 ON t3 (name,hhh);

对WHERE子句中的列建立索引以及连接的列应该有很大帮助。但是,包括SELECT子句中的那些应该通过消除完全访问表的需要来进一步帮助。但需要注意的是,添加索引会降低插入,更新和放大速度。删除和占用空间。

如果在解决索引问题后仍然遇到性能问题,请收集有关表和索引的统计信息。正如Jeffrey Kep建议的那样,你也应该使用绑定变量。此外,查询可能会受益于提示,但如果统计数据是最新的,那么情况很少。

这里真的最好的答案是通过分析解释计划来学习如何调整SQL。 SQL Developer是免费的,可以轻松显示解释计划。在最基本的层面,尝试尽可能消除表访问(完整)。能够在帖子中编写查询,您可以在此级别进行调整。