Oracle
 sql >> база данни >  >> RDS >> Oracle

Заявка на Oracle, използваща „харесване“ в колона с индексиран номер, лоша производителност

КАТО условие за съвпадение на образец очаква да види символни типове както като операнди от лявата, така и от дясната страна. Когато срещне ЧИСЛО, той имплицитно го преобразува в char. Вашата заявка 1 е основно тихо пренаписана на това:

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

Това се случва във вашия случай и това е лошо поради 2 причини:

  1. Преобразуването се изпълнява за всеки ред, което е бавно;
  2. Поради функция (макар и неявна) в предикат WHERE, Oracle не може да използва индекса на A1.ID колона.

За да го заобиколите, трябва да направите едно от следните:

  1. Създайте функционално базиран индекс на A1.ID колона:

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

  2. Ако трябва да съпоставите записи на първите 3 знака от колоната ID, създайте друга колона от тип NUMBER, съдържаща само тези 3 знака, и използвайте обикновен = оператор на него.

  3. Създайте ототделно колона ID_CHAR от тип VARCHAR2 и го попълнете с TO_CHAR(id) . Индексирайте го и използвайте вместо ID във вашето WHERE състояние.

    Разбира се, ако решите да създадете допълнителна колона въз основа на съществуваща колона с ИД, трябва да поддържате тези 2 синхронизирани. Можете да направите това групово като единична АКТУАЛИЗАЦИЯ или в тригер ON-UPDATE, или да добавите тази колона към подходящата Операции INSERT и UPDATE във вашия код.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. разлика между NLS_NCHAR_CHARACTERSET и NLS_CHARACTERSET за Oracle

  2. Има ли булев тип в базите данни на Oracle?

  3. НЕ В селекция с NULL стойности

  4. Намерете и заменете низ в BLOB за работа или Excel файл

  5. Как да изберете * плюс друга колона