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:
- La conversione viene eseguita per ogni riga, che è lenta;
- A causa di una funzione (sebbene implicita) in un predicato WHERE, Oracle non è in grado di utilizzare l'indice su
A1.IDcolonna.
Per aggirarlo, devi eseguire una delle seguenti operazioni:
-
Crea un indice basato su funzioni su
A1.IDcolonna:CREATE INDEX people_idx5 ON people (TO_CHAR(id)); -
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.
-
Crea un separato colonna
ID_CHARdi tipoVARCHAR2e riempilo conTO_CHAR(id). Indicizzalo e usalo al posto diIDnel tuoWHEREcondizione.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.