具有多个表上的连接的SQL查询性能

时间:2012-08-28 08:00:32

标签: sql oracle oracle9i sql-tuning

当我们在查询中加入超过2-3个表时,如果我们在所有表中都有一个公共列,那么当我们

时,性能会有什么不同吗?
  1. 指定所有表中公共列的值。

    代表:

    select e.*
    from emp e, dept d
    where e.deptno = 10
    and d.deptno = 10;
    
  2. 为其中一个公共列提供值并与另一个

    连接

    代表:

    select e.*
    from emp e, dept d
    where e.deptno = 10
    and d.deptno = e.deptno;
    
  3. 提出这个问题的原因是,我有一个查询(成本是17),当我在示例1中指定值但执行挂起时执行,如果我按示例2加入列,则从不执行。

    请帮助我理解这一点。

2 个答案:

答案 0 :(得分:2)

这取决于索引。如果两个表中的该列都有索引,则应该没有区别。但如果没有,第二个可能会慢得多。

deptno独特吗? (在任一表中。)如果是,请设置索引。

答案 1 :(得分:1)

我对独特性问题持不同意见。 DEPTNO在任何一个表上都不一定是唯一的 - 但如果不是,查询的响应可能会很慢。关于索引 - 是的,应该单独使用DEPTNO上的索引,或者使用DEPTNO作为两个表上的第一个字段。没有这样的索引,查询将非常慢。

关于查询结构 - 我更喜欢ANSI查询语法:

SELECT e.*
  FROM EMP e
  INNER JOIN DEPT d
    ON (d.DEPTNO = e.DEPTNO)
  WHERE e.DEPTNO = 10

我不明白为什么DEPT表正在加入,因为你没有使用其中的任何数据,除非DEPTNO = 10的DEPT中可能没有行。假设在DEPT中存在DEPTNO = 10的行,您将通过执行

获得相同的结果
SELECT e.*
  FROM EMP e
  WHERE e.DEPTNO = 10

没有支付将DEPT加入EMP的每个结果行的费用 - 然后转向并从DEPT中丢弃数据。

分享并享受。