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