2015-12-21 3 views
0

Какой из них быстрее, искал CASE или простой оператор CASE?Какой оператор PL/SQL работает быстрее?

xx := case a 
     when 'x' then 'b' 
     when 'y' then 'c' 
     else 'z' 
     end; 

xx := case 
     when a='x' then 'b' 
     when a='y' then 'c' 
     else 'z' 
     end; 
+8

бенчмарк. Но я сомневаюсь, что вы сможете вообще почувствовать какую-либо разницу. – sstan

ответ

4

Простой 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.

+1

100% Согласен. Программисты PL/SQL должны понимать, что это НЕ C, для таких микрооптимизаций нет места. Любая оптимизация должна выполняться в узком месте программы (которая обычно представляет собой длинный SQL, IMHO), где будет какая-либо фактическая производительность. – toddlermenot

+0

По-разному: время, сэкономленное ЦП на протяжении всего срока службы продукта, более чем вероятно будет затмевано на несколько порядков временем, затрачиваемым разработчиком и будущими разработчиками при сохранении кода. –

0

Я думаю, следующим образом:

Давайте подумаем, что это поле на вашем столе. Ваша таблица состоит из большого количества данных. Так что было бы хорошо, если вы создадите индекс в своей таблице a. В этом случае первый способ должен работать быстрее, caz 'он смотрит в индексированной колонке. Принцип заключается в следующем: ваше заявление о ситуации знает, что оно будет работать только с колонкой a, поэтому он не думает о других столбцах. (например, ваша таблица состоит из 20 столбцов, поэтому ваш первый оператор займет только столбец a и поиск по нему). Во втором случае оператор будет работать следующим образом: case statement не инициализирует ничего, он ждет вашего состояния. Поэтому каждый раз, когда он читает условие, он снова и снова ищет соответствие условий (он рассматривает все столбцы). Но если в таблице нет действительно большого количества данных, это не влияет на вас так сильно.

+0

Ты слишком задумываешься об этом. В примере OP нет запроса. Таким образом, здесь не используются столбцы и/или индексы. – sstan

+0

@sstan вот почему я сказал: «Давайте подумаем, что a - поле на столе», а не «a - поле на столе, поэтому ...» – Khazratbek

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