powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация PL/SQL?
21 сообщений из 21, страница 1 из 1
Оптимизация PL/SQL?
    #39395294
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, а с какого момента нижеследующий тест работает так?:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning option
 [code=plsql]
declare N Number:=0;
begin
  dbms_output.put_line('Test 1');
  if N/N>0 then 
    Null;
  end if;
  dbms_output.put_line('No exception in test 1');
  dbms_output.put_line('Test 2');
  if N/N>0 then 
    N:=0;
  end if;
  dbms_output.put_line('No exception in test 2');
exception when others then
  dbms_output.put_line('Exception');
end;
/

Test 1
No exception in test 1
Test 2
Exception

Всегда использовали конструкции для вызова функции как процедуры:
Код: plaintext
if F(..) is null then null;end if;
и вдруг заметили, что функции перестали вызываться. Из-за чего это могло стать так? Как исправить, не модифицируя весь код, где этот метод применялся?
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39395304
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
alter session set plsql_optimize_level = 0;
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39395314
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или plsql_debug
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39395333
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Да, параметр plsql_optimize_level = 2 ставит PLSQL Developer. Исправили - заработало.
Непонятно только как мы раньше-то не замечали? Вроде PLSQL Developer давно не инсталлировали...
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39395347
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRustДа, параметр plsql_optimize_level = 2 ставит PLSQL Developer.Если верить доке по 11.2 , то 2 - это Default value.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39395388
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRustСпасибо. Да, параметр plsql_optimize_level = 2 ставит PLSQL Developer. Исправили - заработало.

какой кошмар, несчастная контора...
никто не не знает, когда кого и за что увольнять.

TRustВсегда использовали конструкции для вызова функции как процедуры:
if F(..) is null then null;end if;

нет . вы всегда использовали конструкции
Код: plsql
1.
2.
3.
  if N/N>0 then 
    Null;
  end if;


N/N - это на ваша F
и даже если бы ваша :
Код: plsql
1.
2.
3.
4.
5.
Function F(N in Number) return Number
Is
Begin
  Return N/N;
End;


Это не обязано вам помочь во всех вариантах использования возможностей plsql

Вы имеете дело с оптимизирующим компилятором.
А это значит:
a) вы всегда не знаете, как на самом выглядит фактически выполняемый код.
б) у него собственные представления о программировании.
И в том, что вы с ними не согласны, виноваты только вы.
В противном случае вы увольняете этот компилятор и нанимаете на работу другой.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401530
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень не советую ставить plsql_optimize_level в значения 1 или 0.
Жутко начинают тормозить PLSQL-таблицы! Замедление на минимум 2 порядка!
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401532
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRustPLSQL-таблицыПереведи.
TRustЗамедление на минимум 2 порядка!Докажи.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401558
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Устанавливаем
Код: plaintext
alter session set plsql_optimize_level = 1

Выполняем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Declare
Type TRecord is Record(
  ID Number,
  Code Varchar2(32),
  Property Varchar2(250),
  Parent Varchar2(32),
  StartedValue Varchar2(4000),
  CurrentValue Varchar2(4000)
);
  Type TTableOfRecord is Table of TRecord index by Varchar2(32);
  Type TTableOfTableOfRecord is Table of TTableOfRecord index by Varchar2(32);
  Tab TTableOfTableOfRecord;
  Code Varchar2(32):='A';
begin
  Tab(Code)('0').ID:=0;
  for i in 1..10000 loop
    if not Tab(Code).exists(i) then
      Tab(Code)(i).ID:=i;
      Tab(Code)(i).Code:=i;
      Tab(Code)(i).Property:=i;
      Tab(Code)(i).StartedValue:=i;
      Tab(Code)(i).CurrentValue:=i;
    end if;
  end loop;
end;
/


Потом устанавливаем
Код: plaintext
alter session set plsql_optimize_level = 2

Выполняем тот же TestCase
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401600
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Executing a PLSQL Procedure that Implements Assocative Arrays Degrades in Performance After an Upgrade to 11.2 (Doc ID 1481681.1)
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401613
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По факту не деградирует, если plsql_optimize_level = 2
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401631
TRustВсегда использовали конструкции для вызова функции как процедуры:
Код: plaintext
if F(..) is null then null;end if;

Для чего вы таким образом вызывали функции как процедуры?
Эти функции имеют побочный эффект?
Если имеют, то становится непонятным почему компилятор исключает их вызов.
Если не имеют, то становится непонятным смысл их вызова.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401801
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оптимизированный компилятор,
Эти функции могут дать исключение. Его-то и важно поймать.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401809
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRust,

считай, что в режиме меньше 2 работает фактически интерпретирующий режим
В нуле вроде прямо так и есть, (надо поднимать скрижали)
Кроме того, в этих режимах работа идет с добавлением debug info
Степень замедления при этом может критически зависеть от версии.
Ну, и про "быстро" - для той истории, которую ты нарисовал, ни в каких режимах быстро никто не обещал.


И, для того, чтобы не рекомендовать , надо сначала разучиться писать IF N/N > 0 THEN.
Иначе нет способа избежать "перестало вызываться"
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401813
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRustоптимизированный компилятор,
Эти функции могут дать исключение. Его-то и важно поймать.
Ля
Эти функции могут не дать исключение.
Расчет на то, что ты его поймаешь в режиме интерпретации в паре с советом использовать
plsql_optimize_level >= 2 - это даже не абсурд, а деменция в последней фазе.

Компилятор берет на себя право исключать, целиком выбрасывать неиспользуемый код,
или такой код, выполнение которого не ведет к изменению состояния вычисления.
Код: plsql
1.
2.
3.
IF N/N > 0 THEN
 Null;
END IF;


такой код, с его точки зрения - бессмыслица, не меняющая состояния вычисления.
Он целиком выкидывается.
Сидеть и ждать после выбрасывания этого кода компилятором исключения - не самое умное дело.

И еще раз - не нравится компилятор - возьми другой.
Это полезнее, чем жаловаться в Спортлото.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401814
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

а выбрасывать его или нет он решает (пока) на основе того - использовал ли ты в таком месте собственную функцию,
или выражение на базе известных ему стандартных, про которые он знает - детерминированы они или нет.
Т.е. If User_Function(N/N) > 0 THEN выброшена (пока) не будет из-за подозрения
на возможное побочное действие внутри User_Function
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401817
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Но даже вариант If User_Function(N/N) > 0 THEN
потенциально можно заставить оказаться полностью исключенный, если креативно воспользоваться подходящей прагмой.
Мораль из этого такая - то, что окажется у тебя не выброшенным
при plsql_optimize_level = 2

имеет право благополучно испариться в трубу компиляции при
plsql_optimize_level = 3
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401908
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не буду спорить с вашими теоретизированиями.
Я исхожу их того, что есть сейчас. А есть несколько миллионов строк PL/SQL кода, причём не только серверного...
Заниматься выявлением всех подобных мест, анализом того, что хотел программист и заменой на более адекватный код - у меня нет ни времени, ни средств, ни желания. Есть задача заставить этот код работать так, как было задумано автором. Быстро.
Потому прошу с подобными советами воздержаться.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401923
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу модератора сдержанно удалить мои посты из этого топика.
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39401959
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наговорил-то

По идее, компилятор может вообще не вызывать процедуру/функцию если ее результаты игнорируются, а сама она WNDS, WNPS
...
Рейтинг: 0 / 0
Оптимизация PL/SQL?
    #39403599
TRust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров, видимо у меня как раз этот случай...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация PL/SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]