Как ускорить выполнение запроса в oracle при объединении таблиц - PullRequest
1 голос
/ 28 января 2020

Я уже задавал этот вопрос, но он был закрыт системой. У меня есть код, после того, как я добавил к нему очень важную часть, он находится на странице, где много данных занимает 3-5 минут для загрузки в течение очень долгого времени. Вот демонстрация, где выделенная часть через https://dbfiddle.uk/?rdbms=oracle_18&fiddle=892dcef2af2f606a7c31d15dfcba7314, что она работает в течение длительного времени. Можно ли оптимизировать код так, чтобы он не отвечал? Я пробовал просматривать таблицы индексов, но это не сработало, я был бы признателен за помощь. Вся проблема с этой частью кода

    AND rep.id not in ( select o.id 
  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o,
       IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
 where o.parent = parent.parent
   and parent.key = 'reader'
   and parent.VALUE_STRING !=  txn.reader_value_string)

Этот код соответствует тому факту, что когда происходит соединение, я не хочу присоединяться к таблице, если читатель мне не подходит. У меня sh У меня не было подзапроса, и результат остался)

Ответы [ 2 ]

1 голос
/ 28 января 2020

Трудно предложить здесь что-либо без трассировки (лучший вариант) или плана выполнения для таких случаев.

Все, что я вижу здесь, подзапрос может быть переписан следующим образом

select id 
  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o,
       IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
 where o.parent = parent.parent
   and parent.key = 'reader'
   and VALUE_STRING !=  txn.reader_value_string;

Но я не уверен, имеет ли это смысл объединять таблицу с самим собой, используя тот же столбец. Возможно, вы хотели присоединиться к o.parent с u.id?

... where o.parent in 
         (select u.id /* <-- */ from ...

Как я уже сказал, если это не поможет, предоставьте нам план запроса или трассировку для этого запроса

0 голосов
/ 28 января 2020

Вам не нужно использовать второй подзапрос здесь:

select . . .
from . . . 
where . . . and 
      not exists (select 1
                  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o
                  where o.key = 'reader' and
                        u.VALUE_STRING <> txn.reader_value_string and
                        rep.id = o.id
                 );
...