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

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top