Сегодня я наткнулся на случай, когда я с готовностью предположил бы простую оптимизацию
как ежу понятно.
Предположим, у вас есть таблица с именем my_table
со столбцом с именем my_column
и
вы пишете хранимую процедуру так:
procedure my_proc(a_value my_table.my_column%type := null) is
begin
for i in (
select another_column from my_table
where a_value is null or my_column = a_value)
loop
-- do something
end loop;
end;
Я всегда предполагал, что выражение a_value is null
является постоянным для
ради оператора select или любого выражения, состоящего исключительно из переменных PL и других констант для этого
иметь значение. Другими словами, это может быть безопасно оценено до выполнения
запрос и заменить константу. В этом коде, например, когда
a_value
не передано, запрос будет эквивалентен
select another_column from my_table
И наоборот, когда значение передано, запрос будет эквивалентен
select another_column from my_table
where my_column = a_value
К моему удивлению, эта простая оптимизация не производится. a_value is null
Кажется, что выражение выполняется для каждой записи в таблице и, с
достаточно большой стол, разница заметна даже без особых
инструменты. Я использую версию 10 и буду рассматривать эту оптимизацию как 2.0 или 3.0
функция, которая была бы сделана давно.
Там должно быть какая-то причина для этого, очевидно. Может быть, мое предположение, что PL
переменные являются константами для глаз SQL-запроса не соответствует действительности. Может быть, PL
переменные могут изменяться во время выполнения запросов SQL. Вы знаете о каких-либо
такой случай?