не включен в запрос выбора

#sql #database #oracle #plsql #oracle11g

#sql #База данных #Oracle #plsql #оракул11g

Вопрос:

 select * from emp where job_type<>'ANALYST';
 

У меня есть аналогичный запрос в моем проекте. Мне сказали найти другой способ удалить not equal to , потому что индекс не используется, если вы это сделаете.

У меня нет другого условия фильтрации, могу ли я немного поработать, чтобы обмануть оптимизатора?

Комментарии:

1. список оставшихся записей длинный, я имею в виду, если я включу другие в in, он будет огромным

Ответ №1:

Мне сказали найти другой способ удалить не равно,

как правило, это плохой совет. Запросы должны быть написаны в соответствии с требуемой функцией. Тем не менее, может случиться так, что ANALYST занимает подавляющее большинство данных в вашей таблице, и, таким образом, вы могли бы сделать что-то вроде:

 select * from emp where job_type < 'ANALYST' or job_type > 'ANALYST'
 

который может быть преобразован оптимизатором внутренне в объединение all по соответствующему индексу. Или, если бы вы заранее знали список различных значений, у вас могло бы быть что-то вроде

 select * from emp where job_type in (...)
 

или, если они были в родительской таблице, что-то вроде

 select * from emp where job_type in 
  ( select job_type from valid_job_types here job_type != 'ANALYST' )
 

исходя из предположения, что EMP является большим, а VALID_JOB_TYPES — маленьким.

Но я бы отступил и попросил обоснование запроса, потому что использование индекса не всегда является лучшим решением

Комментарии:

1. Ого …. никогда не думал, что существует так много способов написать один запрос. огромное тебе спасибо, Коннор. На самом деле мы должны извлекать данные для инструмента отчетности. наши требования к бэкэнду остаются прежними. глядя на временную шкалу, мы должны доставить продукт. мы ожидаем больших изменений в следующем выпуске. команда по производительности подняла вышеупомянутую проблему, поэтому мы ищем обходной путь

2. На самом деле стоимость этого запроса выберите * из emp, где job_type <‘ANALYST’ или job_type> ‘ANALYST’, и запрос, о котором я упоминал, будет таким же. всего в таблице 150 тыс. записей, а 37 тыс. принадлежат Аналитику

3. Что доказывает мою точку зрения (т. Е. Ваша команда по производительности ошибается). Чтобы прочитать 110 тысяч записей из 150 тысяч, полное сканирование таблицы почти всегда будет лучшим вариантом