代码之家  ›  专栏  ›  技术社区  ›  invertigo

JOIN ON与WHERE中的Oracle SQL查询筛选器

  •  9
  • invertigo  · 技术社区  · 12 年前

    对于 内连 ,在 JOIN ON 条款或 WHERE 条款哪个效率更高,或者优化器会使它们相等?

    加入

    SELECT u.name
    FROM users u
    JOIN departments d
    ON u.department_id = d.id
    AND d.name         = 'IT'
    

    哪里

    SELECT u.name
    FROM users u
    JOIN departments d
    ON u.department_id = d.id
    WHERE d.name       = 'IT'
    

    Oracle 11gR2

    2 回复  |  直到 12 年前
        1
  •  12
  •   Justin Cave    12 年前

    应该没有区别。优化器在这两种情况下都应该生成相同的计划,并且应该能够在连接之前、之后或期间应用谓词,这两种情形都基于对特定查询最有效的方法。

    当然,优化器 可以 通常,做一些事情并不能保证优化器 实际上在特定查询中执行某些操作。随着查询变得越来越复杂,不可能详尽地考虑每一个可能的查询计划,这意味着即使有完美的信息和完美的代码,优化器也可能没有时间做你想做的每一件事。您需要查看为两个查询生成的实际计划,看看它们是否实际上相同。

        2
  •  0
  •   Bill Nielsen Emil Daniel Ordoñez Avila    5 年前

    我更喜欢在 where 条款

    对于数据仓库查询,将筛选条件放入联接中似乎会导致查询持续更长时间。

    例如,我有 表1 按字段索引 日期 表2 按字段分区 隔断 . 表2 是查询中最大的表,位于另一个数据库服务器中。我使用 驱动_站点 提示告诉优化器使用 表2 分区。

    select /*+driving_site(b)*/ a.key, sum(b.money) money
      from schema.table1 a
      join schema2.table2@dblink b
        on a.key = b.key
     where b.partition = to_number(to_char(:i,'yyyymm'))
       and a.date = :i
     group by a.key`
    

    如果我以这种方式进行查询,返回结果大约需要30-40秒。

    如果我不这样做查询,大约需要10分钟,直到我取消执行而没有结果。