Эффективная альтернатива внешнему соединению - PullRequest
0 голосов
/ 24 апреля 2009

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)

ПРИМЕЧАНИЕ. Все показанные столбцы (кроме полного имени) проиндексированы и являются первичным ключом некоторой таблицы.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2009

Поскольку вы выполняете внешнее объединение, может оказаться, что на самом деле более эффективно выполнять полное сканирование таблицы, а не использовать индекс.

Если вы убеждены, что индекс следует использовать, приведите подсказку:

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

тогда посмотри что получится ...

1 голос
/ 24 апреля 2009

Некоторое время я не писал sql для Oracle, но я бы написал запрос следующим образом:

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

Это все еще плохо?

1 голос
/ 24 апреля 2009

Нет необходимости вкладывать запросы. Попробуйте это:

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