Alternativa efficiente per Outer Join
-
13-09-2019 - |
Domanda
Il RIGHT JOIN
su questa query provoca un TABLE ACCESS FULL
su lims.operator
. Un regolare unirsi corre in fretta, ma, naturalmente, i campioni 'WHERE authorised_by IS NULL
' non si vedono.
C'è un'alternativa più efficiente a una RIGHT JOIN
in questo caso?
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)
NOTA:. Tutte le colonne indicate (eccetto full_name) sono indicizzati e la chiave primaria di qualche tabella
Soluzione
Dal momento che si sta facendo un outer join, potrebbe facilmente essere che in realtà è più efficiente di fare un tavolo pieno di scansione, piuttosto che utilizzare l'indice.
Se si è convinti dovrebbe essere utilizzato l'indice, forzarla con un suggerimento:
SELECT / * + INDEX (lims.operator operator_index_name) * / ...
poi vedere cosa succede ...
Altri suggerimenti
Non c'è bisogno di query nido. Prova questo:
select s.full_name
from lims.operator o, lims.sample s
where o.operator_id = s.authorised_by(+)
and s.sample_template_id = 200
non ho scritto di SQL per Oracle da un po ', ma vorrei scrivere la query in questo modo:
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
Questo esegue ancora così male?