Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизация PL/SQL? / 21 сообщений из 21, страница 1 из 1
31.01.2017, 11:49
    #39395294
TRust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Скажите, а с какого момента нижеследующий тест работает так?:

Код: 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
31.01.2017, 11:52
    #39395304
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Код: plsql
1.
alter session set plsql_optimize_level = 0;
...
Рейтинг: 0 / 0
31.01.2017, 11:59
    #39395314
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
или plsql_debug
...
Рейтинг: 0 / 0
31.01.2017, 12:18
    #39395333
TRust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Спасибо. Да, параметр plsql_optimize_level = 2 ставит PLSQL Developer. Исправили - заработало.
Непонятно только как мы раньше-то не замечали? Вроде PLSQL Developer давно не инсталлировали...
...
Рейтинг: 0 / 0
31.01.2017, 12:28
    #39395347
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
TRustДа, параметр plsql_optimize_level = 2 ставит PLSQL Developer.Если верить доке по 11.2 , то 2 - это Default value.
...
Рейтинг: 0 / 0
31.01.2017, 12:59
    #39395388
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
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
09.02.2017, 12:45
    #39401530
TRust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Очень не советую ставить plsql_optimize_level в значения 1 или 0.
Жутко начинают тормозить PLSQL-таблицы! Замедление на минимум 2 порядка!
...
Рейтинг: 0 / 0
09.02.2017, 12:47
    #39401532
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
TRustPLSQL-таблицыПереведи.
TRustЗамедление на минимум 2 порядка!Докажи.
...
Рейтинг: 0 / 0
09.02.2017, 13:14
    #39401558
TRust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Устанавливаем
Код: 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
09.02.2017, 13:50
    #39401600
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
Executing a PLSQL Procedure that Implements Assocative Arrays Degrades in Performance After an Upgrade to 11.2 (Doc ID 1481681.1)
...
Рейтинг: 0 / 0
09.02.2017, 14:07
    #39401613
TRust
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация PL/SQL?
По факту не деградирует, если plsql_optimize_level = 2
...
Рейтинг: 0 / 0
09.02.2017, 14:31
    #39401631
Оптимизация PL/SQL?
TRustВсегда использовали конструкции для вызова функции как процедуры:
Код: plaintext
if F(..) is null then null;end if;

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

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


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

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


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

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

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

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

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

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


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