КАТО условие за съвпадение на образец очаква да види символни типове както като операнди от лявата, така и от дясната страна. Когато срещне ЧИСЛО, той имплицитно го преобразува в char. Вашата заявка 1 е основно тихо пренаписана на това:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
Това се случва във вашия случай и това е лошо поради 2 причини:
- Преобразуването се изпълнява за всеки ред, което е бавно;
- Поради функция (макар и неявна) в предикат WHERE, Oracle не може да използва индекса на
A1.IDколона.
За да го заобиколите, трябва да направите едно от следните:
-
Създайте функционално базиран индекс на
A1.IDколона:CREATE INDEX people_idx5 ON people (TO_CHAR(id)); -
Ако трябва да съпоставите записи на първите 3 знака от колоната ID, създайте друга колона от тип NUMBER, съдържаща само тези 3 знака, и използвайте обикновен = оператор на него.
-
Създайте ототделно колона
ID_CHARот типVARCHAR2и го попълнете сTO_CHAR(id). Индексирайте го и използвайте вместоIDвъв вашетоWHEREсъстояние.Разбира се, ако решите да създадете допълнителна колона въз основа на съществуваща колона с ИД, трябва да поддържате тези 2 синхронизирани. Можете да направите това групово като единична АКТУАЛИЗАЦИЯ или в тригер ON-UPDATE, или да добавите тази колона към подходящата Операции INSERT и UPDATE във вашия код.