Простой CASE
и искал CASE
Заявления одинаково быстрые.
Сравнение производительности затруднено даже для такого простого вопроса. Мой ответ основан на трех причинах ниже.
Простой тест
Два анонимных блоков ниже запуска различного рода дела заявления. Они выполнялись 5 раз (выкидывать какие-либо крайности, вызванные «холодной» системой) и чередуя прогоны (чтобы системная активность не несправедливо влияла только на один тип).
set serveroutput on;
--Simple CASE.
declare
a varchar2(100) := 'z';
b varchar2(1);
begin
for i in 1 .. 40000000 loop
a := i;
b := case a when 'x' then 'b' when 'y' then 'c' else 'z' end;
end loop;
end;
/
--Searched CASE.
declare
a varchar2(100) := 'z';
b varchar2(1);
begin
for i in 1 .. 40000000 loop
a := i;
b := case when a='x' then 'b' when a='y' then 'c' else 'z' end;
end loop;
end;
/
Пробеги были смехотворно близки. Обычно я не ожидал, что даже один и тот же код будет работать так равномерно.
--Simple CASE
Elapsed: 00:00:11.04
Elapsed: 00:00:11.00
Elapsed: 00:00:11.04
Elapsed: 00:00:10.99
Elapsed: 00:00:10.99
Average: 11.012
--Searched CASE
Elapsed: 00:00:11.04
Elapsed: 00:00:10.98
Elapsed: 00:00:11.00
Elapsed: 00:00:10.99
Elapsed: 00:00:11.02
Average: 11.006
разница в производительности не будет иметь смысл
Различные форматы CASE
просто синтаксические различия. Самый простой способ программирования синтаксического анализатора и компилятора состоял в том, чтобы перевести обе формы в одно внутреннее представление и вызвать один и тот же код для каждого. Если по какой-то причине один метод был намного быстрее, чем другой, в какой-то момент разработчики, вероятно, скопировали бы этот код и сделали бы то же самое.
Помимо редких ошибок, существует несколько мест, где такие незначительные синтаксические различия имеют значение. Заманчиво верить, что есть разница, потому что мы все хотим, чтобы простые правила выполнялись, чтобы сделать наш код быстрее. Программирование было бы простым, если бы мы могли просто следовать списку правил синтаксиса: «<> быстрее, чем! =», «Count (1) быстрее, чем count (*)» и т. Д. Но эти примеры, хотя и повторялись много раз, являются полными мифами.
разница в производительности не имеет значения Во всяком случае
Время, проведенное оценке CASE
заявление должно быть несоответствующим в почти каждой базе данных Oracle. Даже если один метод CASE
был в два раза медленнее другого, он должен быть незаметным - зачем Oracle обрабатывать PL/SQL-линию миллионы раз в секунду?Настоящая работа должна выполняться в SQL, а время для чтения данных с жесткого диска более значимо, чем минимальное количество процессорного времени, чтобы оценить оператор CASE
.
бенчмарк. Но я сомневаюсь, что вы сможете вообще почувствовать какую-либо разницу. – sstan