Oracle
 sql >> Database >  >> RDS >> Oracle

Query Oracle utilizzando "mi piace" sulla colonna del numero indicizzato, prestazioni scadenti

MI PIACE condizione di corrispondenza dei modelli si aspetta di vedere i tipi di carattere sia come operandi di sinistra che di destra. Quando incontra un NUMBER, lo converte implicitamente in char. La tua query 1 viene sostanzialmente riscritta silenziosamente in questo:

SELECT a1.*
  FROM people a1
 WHERE TO_CHAR(a1.id) LIKE '119%'
   AND ROWNUM < 5

Succede nel tuo caso ed è negativo per 2 motivi:

  1. La conversione viene eseguita per ogni riga, che è lenta;
  2. A causa di una funzione (sebbene implicita) in un predicato WHERE, Oracle non è in grado di utilizzare l'indice su A1.ID colonna.

Per aggirarlo, devi eseguire una delle seguenti operazioni:

  1. Crea un indice basato su funzioni su A1.ID colonna:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. Se devi abbinare i record ai primi 3 caratteri della colonna ID, crea un'altra colonna di tipo NUMBER contenente solo questi 3 caratteri e usa un semplice = operatore su di esso.

  3. Crea un separato colonna ID_CHAR di tipo VARCHAR2 e riempilo con TO_CHAR(id) . Indicizzalo e usalo al posto di ID nel tuo WHERE condizione.

    Ovviamente se scegli di creare una colonna aggiuntiva in base alla colonna ID esistente, devi mantenere quelle 2 sincronizzate. Puoi farlo in batch come un singolo UPDATE, o in un trigger ON-UPDATE, o aggiungere quella colonna all'appropriato Istruzioni INSERT e UPDATE nel tuo codice.