2016-04-26 2 views
0

Когда я запускаю запрос с помощью SQL Developer и использую переменные связывания, такие как :type Мне предлагается использовать значения, а затем запросы выполняются быстрее, чем если бы я заменил переменные связывания фиксированными буквальное значение, скажем 'A'.Запросы выполняются медленно без параметров в SQL Developer

Например первый запрос, который работает быстрее, чем второй запрос:

Первый запрос (работает 0,5 сек)

select DMDUNIT, LOC, SUM(QTY) 
from hist 
where dmdunit = :lv_dmdunit and type = :lv_type and loc = :lv_loc 
and startdate >= sysdate - 40 
GROUP BY DMDUNIT,LOC 

Второй запрос (работает 1,7 сек)

select DMDUNIT, LOC, SUM(QTY) 
from hist 
where dmdunit = 'PROD_1' and type = 'A' and loc = 'B101' 
and startdate >= sysdate - 40 
GROUP BY DMDUNIT,LOC 

Почему первый запрос выполняется быстрее, чем второй запрос? Какие шаги я могу предпринять, чтобы второй запрос выполнялся так же быстро, как и первый?

Это небольшой запрос и 1 секунда не имеет большого значения, но у меня также есть большие запросы, где разница между теми же запросами (params и non-params) составляет от 10 до 15 минут.

+0

Что планы выполнения показывают для обоих запросов? Какую версию базы данных Oracle вы используете? (Кроме того, в SQL Developer вы можете установить значения привязки как часть скрипта, используя команду 'variable' и анонимный блок, если вы не хотите вводить их при запросе) –

+0

Вероятно, это связано с« Принудительным параметром » »- выполните поиск, чтобы найти больше. – Hogan

ответ

1

Вот интересный тест: просто для удовольствия измените имена ваших переменных привязки (например, назовите их: x,: y и: z) - или, что еще лучше, просто измените одну букву в одном из переменные. В первый раз, когда вы запускаете запрос, он занимает примерно столько же времени, сколько второй запрос, если все остальное равно (чего никогда не было).

Одним из преимуществ использования переменных связывания является то, что запрос анализируется только один раз. Механизму по-прежнему необходимо выполнить запрос, но избегать дополнительных затрат на интерпретацию запроса, его оптимизацию и т. Д. Техническими терминами являются «мягкий разбор» и «жесткий анализ». Хорошее чтение по этому вопросу:

https://blogs.oracle.com/sql/entry/improve_sql_query_performance_by

Смежные вопросы