Потеря индекса в операторе LIKE с префиксом "%" - PullRequest
1 голос
/ 11 июля 2019

PL / SQL Developer - Oracle10g

У меня есть запрос, который теряет индекс, когда он установлен с помощью оператора LIKE, но только с префиксом "%"

Например:

select * from people where name like '%POTATO'

возвращаемое значение «полный доступ» в таблице о целях оптимизатора. Как получить контурное решение?

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Если вы считаете действительно важным запросить по такому специальному окончанию имени, рассмотрите возможность создания function-based индекса:

create index idx_special_people
on people(upper(substr(name,-6)));

сбора статистики таблицы:

exec dbms_stats.gather_table_stats(user, 'people', cascade => true);

и вызова как:

select * 
  from people 
 where upper(substr(name,-6)) = 'POTATO'
0 голосов
/ 13 июля 2019

Оптимизатор будет стоить различных подходов, включая полное сканирование таблицы и полное сканирование индекса. Предположительно его расчеты показали, что полное сканирование таблицы будет более эффективным. Это вполне вероятно, поскольку вам придется полностью сканировать весь индекс, чтобы найти ключи, заканчивающиеся на «POTATO», в то время как ключи, начинающиеся на «POTATO», хранятся вместе (как в телефонной книге).

Если вы поделитесь информацией о таблицах и индексах, объемах данных и плане выполнения, кто-то может посоветовать более подробно.

0 голосов
/ 11 июля 2019

Вы можете попробовать использовать подсказку:

select /*+ INDEX(people indexname) */ * from people where name like '%POTATO'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...