Oracle non si utilizza l’indice quando si uniscono

Sono molto nuovo a indice e spiegare i piani, quindi per favore abbiate pazienza con me!
Sto cercando di ottimizzare una query, ma sto avendo problemi.

Ho due tabelle:

SKU
------
SKUIDX (Unique index)
CLRIDX (Index)
..
..

IMPCOST_CLR
-----------
ICCIDX (Unique index)
CLRIDX (Index)
...
..

Quando faccio una select * from SKU where clridx = 122, vedo che si sta usando l’indice del piano di spiegare (si dice ACCESSO alla TABELLA.. INDICE, si dice il nome di indice sotto OBJECT_NAME e le opzioni di SCANSIONE INTERVALLO).

Ora, quando cerco di unire sullo stesso campo, non sembra utilizzare l’indice (si dice ACCESSO alla TABELLA.. HASH JOIN e sotto opzioni, si dice COMPLETO).

Cosa devo cercare per provare e vedere cos’è che non utilizzando l’indice?
Mi dispiace, io non sono sicuro di quello che i comandi da digitare per mostrare questo, quindi per favore fatemi sapere se avete bisogno di ulteriori informazioni.

Esempi:

1 ° quesito:

  SELECT
    *
  FROM
    AP21.SKU
  WHERE
    CLRIDX = 100

Oracle non si utilizza l'indice quando si uniscono

2 query:

  SELECT
    *
  FROM
    AP21.IMPCOST_CLR
  WHERE
    CLRIDX = 100

Oracle non si utilizza l'indice quando si uniscono

3 query:

  SELECT
    *
  FROM
    AP21.SKU
  INNER JOIN
    AP21.IMPCOST_CLR ON
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX

Oracle non si utilizza l'indice quando si uniscono

  • Qual è la query da utilizzare quando si uniscono?
  • Hi – vedere la mia modifica. La query im cercando di ottimizzare centinaia di molto di più, ma la rottura verso il basso e prendere un passo alla volta!
  • Come hai risolto la scansione completa del problema?
  • da capire proprio come SQL e query di lavoro 🙂 Vedere la risposta qui sotto
InformationsquelleAutor Lock | 2013-07-16



2 Replies
  1. 18

    Occhiata a questa query:

    SELECT
        *
    FROM
        AP21.SKU
    INNER JOIN
        AP21.IMPCOST_CLR ON
        IMPCOST_CLR.CLRIDX = SKU.CLRIDX

    Non ha ulteriori predicati. Così si stanno unendo tutte le righe SKU per tutte le righe IMPCOST_CLR. Inoltre la selezione di tutte le colonne da entrambe le tabelle.

    Questo significa che Oracle ha per leggere la totalità di entrambe le tabelle. Il modo più efficace per farlo è quello di utilizzare la Scansione Completa della Tabella, per raccogliere tutte le righe multi-blocco di legge, e servirsene per corrispondere ai valori di adesione.

    Fondamentalmente, si tratta di un operazione di impostazione, che è quello che SQL funziona molto bene, mentre indicizzati legge sono più RBAR. Ora, se hai modificato la terza query di includere un ulteriore predicato, come

    WHERE SKU.CLRIDX = 100

    è più probabile vedere il percorso di accesso ripristinare INDICE di SCANSIONE INTERVALLO . Perché tu sei solo la selezione comparativa manciata di righe, in modo indicizzato leggi di più efficace è il percorso, ancora una volta.


    “La query im cercando di ottimizzare centinaia di molto di più, ma di rottura
    verso il basso e prendere un passo alla volta! “

    Questa è una buona tecnica, ma è necessario capire come Oracle optimzer opere. C’è un sacco di informazioni a Spiegare il Piano. Per saperne di più. Prestare attenzione al valore del Rows colonna per ogni passo. Che indica il numero di righe che il Optimizer si aspetta di ottenere dall’operazione. Vedrete valori molto diversi per le prime due query rispetto al terzo.

    • C’è un modo per evitare la scansione completa in questo caso?
    • in questo caso la Scansione Completa della Tabella è il modo più efficace per accedere ai dati. Quindi, perché si vuole evitare di usarlo?

Lascia un commento