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