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.ID
colonna.
Per aggirarlo, devi eseguire una delle seguenti operazioni:
-
Crea un indice basato su funzioni su
A1.ID
colonna: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_CHAR
di tipoVARCHAR2
e riempilo conTO_CHAR(id)
. Indicizzalo e usalo al posto diID
nel tuoWHERE
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.