2

当我们在一个查询中连接超过 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;
    

问这个问题的原因是,我有一个查询(成本为 17),它在我指定示例 1 中的值时执行,但如果我加入示例 2 中的列,它会挂起并且永远不会执行。

请帮助我理解这一点。

4

2 回答 2

2

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

deptno 是唯一的吗?(在任何一个表中。)如果是 make CERTAIN,您可以这样设置索引。

于 2012-08-28T08:06:48.590 回答
1

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

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

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

我不明白为什么要连接 DEPT 表,因为您没有使用其中的任何数据,除非 DEPT 中可能没有 DEPTNO=10 的行。假设 DEPT 中存在 DEPTNO=10 的行,您将通过执行获得相同的结果

SELECT e.*
  FROM EMP e
  WHERE e.DEPTNO = 10

无需支付将 DEPT 加入 EMP 的每个结果行的成本 - 然后转身丢弃来自 DEPT 的数据。

分享和享受。

于 2012-08-28T11:40:43.487 回答