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