КАТО условие за съвпадение на образец очаква да види символни типове както като операнди от лявата, така и от дясната страна. Когато срещне ЧИСЛО, той имплицитно го преобразува в 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 във вашия код.