17 (round((dbms_utility.get_time-l_start)/100, 2) ||
18 ' seconds...');
19 end;
20 /
14.86 seconds...
PL/SQL procedure successfully completed.
В этом коде используется динамический SQL для запроса одной строки из таблицы
ALL_OBJECTS
. Он генерирует 1000 уникальных запросов со значениями 1, 2, 3, ... и
так далее, жестко заданными в конструкции WHERE. На моем ноутбуке с процессором
Pentium 300 Мгц для его выполнения потребовалось около 15 секунд (скорость выпол-
нения на разных машинах может быть различной).
Теперь сделаем то же самое с использованием связываемых переменных:
tkyte@TKYTE816> declare
2 type rc is ref cursor;
3 l_rc rc;
4 l_dummy all_objects.object_name%type;
5 l_start number default dbms_utility.get_time;
6 begin
7 for i in 1 . . 1000
49
50
Глава 1
8 loop
9 open l_rc for
10 'select object_name
11 from all_objects
12 «here object_id = :x'
13 using i;
14 fetch l_rc into l_dummy;
15 close l_re;
16
end
loop;
17 dbms_output.put_line
18 (round((dbms_utility.get_time-l_start)/100, 2) ||
19 ' seconds...');
20 end;
21 /
1.27 seconds.. .
PL/SQL procedure successfully completed.
В этом коде использован точно такой же алгоритм. Единственное изменение — вме-
сто жестко заданных значений 1, 2, 3... и так далее в запросе используется связываемая
переменная. Результаты весьма впечатляющи. Код не только выполняется намного бы-
стрее
(разбор
запросов требовал больше времени, чем их реальное
выполнение!),
но и
позволяет большему количеству пользователей одновременно работать с системой.
Выполнение операторов SQL без связываемых переменных во многом подобно пе-
рекомпиляции подпрограммы перед каждым вызовом. Представьте себе передачу кли-
ентам такого исходного кода на языке Java, что перед любым вызовом метода класса им
необходимо вызывать компилятор Java, компилировать класс и выбрасывать сгенери-
рованный байт-код сразу после выполнения метода. При необходимости вызова того же
метода в дальнейшем им пришлось бы делать то же самое — компилировать, запускать
и выбрасывать байт-код. В своих приложениях никто так не поступает — не делайте этого
и в СУБД.
В главе 10 мы рассмотрим способы определить, используются ли связываемые пере-
менные, различные варианты их применения, поддерживаемую СУБД возможность ав-
томатической подстановки связываемых переменных и т.д. Мы также рассмотрим
особый случай, когда использование связываемых переменных нежелательно.
Часто, как и в рассматриваемом проекте, — переписывание существующего кода так,
чтобы использовались связываемые переменные, является единственно возможным вы-
ходом. Получаемый в результате код работает на несколько порядков быстрее и во много
раз увеличивается количество поддерживаемых системой одновременно работающих
пользователей. Для этого, однако, требуется много времени и усилий. Дело не в том,
что использовать связываемые переменные сложно или при этом часто делают ошибки, —
проблема в том, что с самого начала этого не делали, и поэтому пришлось пересмотреть
и изменить практически
весь
код. Разработчикам не пришлось бы платить такую цену,
если бы они с первого дня понимали принципиальную важность использования в при-
ложении связываемых переменных.
Разработка успешных приложений для Oracle
Do'stlaringiz bilan baham: |