外连接的有效替代方案

时间:2009-04-23 21:47:39

标签: oracle outer-join

此查询的RIGHT JOIN会在TABLE ACCESS FULL上生成lims.operator。常规联接可以快速运行,但当然,样本“WHERE authorised_by IS NULL”不会显示。

在这种情况下,RIGHT JOIN是否有更有效的替代方案?

  SELECT   full_name
  FROM       (SELECT   operator_id AS authorised_by, full_name
                FROM lims.operator)
  RIGHT JOIN (SELECT   sample_id, authorised_by
                FROM   lims.sample
               WHERE   sample_template_id = 200)
  USING (authorised_by)

注意:显示的所有列(full_name除外)都是索引的,并且是某个表的主键。

3 个答案:

答案 0 :(得分:2)

由于您正在进行外连接,因此实际上更有效的是执行全表扫描而不是使用索引。

如果您确信应该使用索引,请使用提示强制它:

SELECT / * + INDEX(lims.operator operator_index_name)* / ...

然后看看会发生什么......

答案 1 :(得分:1)

无需嵌套查询。试试这个:

select s.full_name
from lims.operator o, lims.sample s
where o.operator_id = s.authorised_by(+)
and s.sample_template_id = 200

答案 2 :(得分:1)

我一段时间没有为oracle编写sql,但我会写这样的查询:

SELECT lims.operator.full_name
FROM       lims.operator
RIGHT JOIN lims.sample
           on lims.operator.operator_id = lims.sample.authorized_by
           and sample_template_id = 200

这仍然表现不好吗?