Индексирование для столбцов в ORACLE - PullRequest
0 голосов
/ 05 октября 2018

У меня есть запрос ниже, поскольку из-за огромных данных в таблице MATTER выполнение оператора LIKE занимает много времени, поэтому я подумывал об использовании индекса CONTEXT и использовании CONTAIN.Должен ли я выполнять индексирование только по Matter_title или какому-либо другому столбцу.На основании запроса выбора ниже

Входные данные высоко оценены

SELECT DISTINCT dm.MATTER_SEQ  
FROM MATTER dm
    ,MATTER_TYPE dmt
    ,MATTER_SUBTYPE dms
    ,STATUS ds
    ,FILING df  
 WHERE dm.MATTER_TYPE_SEQ=dmt.MATTER_TYPE_SEQ
   AND dm.MATTER_SUBTYPE_SEQ=dms.MATTER_SUBTYPE_SEQ
   AND dm.STATUS_CODE NOT IN ('abc','jkl','xyz')
   AND dm.STATUS_CODE = DS.STATUS_CODE
   AND dm.IS_EXTERNAL='1'
   AND dm.IS_DELETED='0'
   AND dm.MATTER_SEQ = df.MATTER_SEQ        
   AND trunc(dm.CREATED_DATE) between '01-NOV-95' AND '02-OCT-18'  
   AND upper(dm.MATTER_TITLE) like(upper (q'{%jdasuidhajsndjahs%}'))

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Похоже, вы уже знаете, что LIKE с лидирующим подстановочным знаком ('% ABC') общеизвестно неэффективен, поскольку обычно не может использовать индексы и выполняет полное сканирование таблицы.

Если другие предложения по оптимизации мало помогают, вы, вероятно, увидите более высокую производительность при использовании индекса контекста.Обязательно установите параметр SUBSTRING_INDEX, чтобы он специально подготовил индекс для инфиксных поисков, подобных вашему. См. Спросите Тома для более подробной информации .(Если вы также будете иметь подстановочные знаки в середине строк ('ABC% DEF'), вы также можете установить параметры PREFIX.)

begin
    ctx_ddl.create_preference('SUBSTRING_PREF','BASIC_WORDLIST');
    ctx_ddl.set_attribute('SUBSTRING_PREF','SUBSTRING_INDEX','TRUE');
end;
create index matter_title_idx on MATTER(MATTER_TITLE)
    indextype is ctxsys.context 
    parameters ('wordlist SUBSTRING_PREF');

Также обратите внимание, что индексы контекста нечувствительны к региструпо умолчанию, поэтому вам не нужно делать UPPER ().Я не пробовал использовать литералы q 'с содержанием, поэтому не уверен, как это будет работать.

AND CONTAINS(dm.MATTER_TITLE, q'{%jdasuidhajsndjahs%}') > 0
0 голосов
/ 05 октября 2018

Попробуйте создать функцию индексов верхнего (dm.MATTER_TITLE) и второго усечения (dm.CREATED_DATE).

Также я считаю, что столбцы в условиях соединения уже имеют индексы.Если нет, то их нужно проиндексировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...