Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Оптимизация запроса с подзапросом в Oracle

#sql #oracle #plsql_developer


Здравствуйте. Есть запрос. Отрабатывает в sql-developer 60 секунд. Второй раз запускаю
8 секунд, 3 раз 3.5 секунды. Кэшируется вообщем. Минут через 10 та же история. Наверное
за это время кэш падает. Когда этот запрос первый раз выполянется из кода c# на строчке
rdr.Read() вообще выполняется минут 5-10 rdr - OracleDataReader. Не понимаю что ещё
можно упростить в запросе. Всё и так проиндексировано кроме поелей edit_state и primary_date.
Вообщем вот запрос и explain plan к нему.

SELECT r.id
FROM INTERSHOP.JOURNAL_RECORDS r
WHERE r.edit_state = 0
      AND r.journal_id = 515
      AND r.journal_table_id = 1
      AND
(
    SELECT STRING_VALUE
    FROM journal_field_data f
    WHERE r.id = f.journal_record_id
          AND field_name = 'SERTIF_NUMB'
) = :SERTIF_NUMB 
ORDER BY r.PRIMARY_DATE DESC;




Если я правильно понял то там где написано full очень много занимает памяти, но там
всё проиндексировано. И я немного не понимаю но неужели order by весит ещё больше?
Подскажите пожалуйста что тут можно сделать. Я уже даже не знаю что попробовать.  

UPD
Исправленный вариант запроса:

SELECT r.id
FROM INTERSHOP.JOURNAL_RECORDS r
     LEFT JOIN journal_field_data f ON r.id = f.journal_record_id
WHERE r.edit_state = 0
      AND r.journal_id = 515
      AND r.journal_table_id = 1
      AND field_name = 'SERTIF_NUMB'
      AND f.STRING_VALUE = :SERTIF_NUMB
ORDER BY r.PRIMARY_DATE DESC;



    


Ответы

Ответ 1



Можно использовать 2 варианта. Первый: SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r JOIN journal_field_data f ON r.id = f.journal_record_id WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 AND field_name = 'SERTIF_NUMB' AND f.STRING_VALUE = :SERTIF_NUMB ORDER BY r.PRIMARY_DATE DESC; Второй: SELECT r.id FROM INTERSHOP.JOURNAL_RECORDS r JOIN journal_field_data f ON r.id = f.journal_record_id AND f.field_name = 'SERTIF_NUMB' AND f.STRING_VALUE = :SERTIF_NUMB WHERE r.edit_state = 0 AND r.journal_id = 515 AND r.journal_table_id = 1 ORDER BY r.PRIMARY_DATE DESC; Получить представление об общих принципах оптимизации запросов можно из статей на Википедии: Семантическая оптимизация запросов СУБД Оптимизация запросов СУБД Почему тут не нужен LEFT JOIN - и вообще, кратко и наглядно о различных вариантах соединений - на иллюстрации:

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

Отправить комментарий