Страницы

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

вторник, 12 марта 2019 г.

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

Здравствуйте. Есть запрос. Отрабатывает в 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;


Ответ

Можно использовать 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 - и вообще, кратко и наглядно о различных вариантах соединений - на иллюстрации:

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

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