Самосоединение замедляет выполнение моей задачи в Oracle 11g

#sql #oracle11g #self-join #oracle11gr2 #sql-tuning

#sql #oracle11g #самосоединение #oracle11gr2 #настройка sql

Вопрос:

У меня есть таблица с именем as event_extra и для поиска дубликатов на основе некоторых условий, которые я написал следующим запросом самосоединения, но когда записей больше (1 миллион), это занимает много времени.

Поля таблицы следующие

 evt_id
extra1
extra2
extra3
extra4
extra5
extra6
extra7
extra8
extra9
  

Эта таблица Unique index включена evt_id .

Запрос самосоединения

 select cde1.evt_id,
       cde1.extra1,
       cde1.extra2,
       cde1.extra3,
       cde1.extra4,
       cde1.extra5,
       cde1.extra6,
       cde2.evt_id as evt_id2,
       cde1.extra7,
       cde1.extra8,
       cde1.extra9,
  from event_extra cde2
  join event_extra cde1
    on (( cde1.extra4 = cde2.extra4 and cde1.extra7 = cde2.extra7) or
       (cde1.extra4 = cde2.extra5 and cde1.extra7 = cde2.extra8) or
       (cde1.extra4 = cde2.extra6 and cde1.extra7 = cde2.extra9) or
       (cde1.extra5 = cde2.extra4 and cde1.extra8 = cde2.extra7) or
       (cde1.extra5 = cde2.extra5 and cde1.extra8 = cde2.extra8) or
       (cde1.extra5 = cde2.extra6 and cde1.extra8 = cde2.extra9) or
       (cde1.extra6 = cde2.extra4 and cde1.extra9 = cde2.extra7) or
       (cde1.extra6 = cde2.extra5 and cde1.extra9 = cde2.extra8) or
       (cde1.extra6 = cde2.extra6 and cde1.extra9 = cde2.extra9))
   and ((to_number(cde1.extra3) >= to_number(cde2.extra1) and
       (to_number(cde1.extra3) <= to_number(cde2.extra2))) or
       ((to_number(cde1.extra1) >= to_number(cde2.extra2)) and
       (to_number(cde1.extra1) <= to_number(cde2.extra3))) or
       ((to_number(cde1.extra2) >= to_number(cde2.extra1)) and
       (to_number(cde1.extra2) <= to_number(cde2.extra3))))
   and cde1.evt_id > cde2.evt_id
 order by cde1.evt_id;
  

Существует ли какой-либо другой доступный подход, позволяющий повысить производительность вышеупомянутого запроса?

 Database Version: Oracle11g
  

Ответ №1:

ПОСМОТРИТЕ Условия, при которых запрос должен выполняться медленно.Кроме того, вы снова использовали order by this, что усугубляет ситуацию. Что вы можете сделать, это удалить order by и выбрать этот вывод во временной таблице и выполнить операцию и выбор в этой таблице. Кроме того, попробуйте разместить индексы в столбцах.