powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Насколько Oracle умён в плане оптимизации вычислений?
14 сообщений из 14, страница 1 из 1
Насколько Oracle умён в плане оптимизации вычислений?
    #39730955
IAmAllan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть строковое поле вида tra-la-la / bla-bla-bla, обеих частей может и не быть (меня не бейте, я бы тоже в двух полях хранил).
Выполняем запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT CASE WHEN INSTR (fld, '/') = 0 THEN fld
         ELSE SUBSTR (fld, 1, INSTR (fld, '/')-1)
       END l,
       CASE WHEN INSTR (fld, '/') = 0 THEN NULL
         ELSE SUBSTR (fld, INSTR (fld, '/')+1)
       END r
FROM tbl



Сколько раз для каждой строки Oracle будет вычислять INSTR (fld, '/')?
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39730972
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IAmAllanСколько раз для каждой строки Oracle будет вычислять INSTR (fld, '/')?-ннадцать. А ты не там ищешь поле для оптимизации.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731129
IAmAllan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicIAmAllanСколько раз для каждой строки Oracle будет вычислять INSTR (fld, '/')?-ннадцать. А ты не там ищешь поле для оптимизации.

Про надцать догадываюсь. Просто интересно же, нет?
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731141
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IAmAllanПро надцать догадываюсь.

А вот я нет. Вопрос-то с подковыркой. Если бы ты спросил солько раз выпoлняется INSTR (fld, '/') в:

Код: plsql
1.
SELECT INSTR (fld, '/'),INSTR (fld, '/') + 99,SUBSTR(fld,INSTR (fld, '/') + 1) FROM TBL;



то ответ бы был - один раз на строку. Грубо говоря, парсер бы заменил все INSTR (fld, '/') ссылками на одну и ту же временную переменную а вычисление INSTR (fld, '/') и присвоение результата этой временной переменной поставил до ссылок. Но в твоем примере INSTR (fld, '/') используется в CASE, а CASE использует short circuit evaluation и посему выражение WHEN будет вычисляться только если предыдущее не дало TRUE и Oracle просто не может поставить вычисление INSTR (fld, '/') и присвоение результата этой временной переменной до ссылок. Есть ли у Oracle механизм проверки "а был ли мальчик" в CASE - не знаю и не думаю это можно проверить. Хотя есть нюанс - первая кляуза WHEN вычисляется всегда. Вопрос в том достаточо ли умен парсер чтобы этим воспользоваться?

SY.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731161
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYГрубо говоря, парсер бы заменил все INSTR (fld, '/') ссылками на одну и ту же временную переменнуюнет, не заменил бы
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731163
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderнет, не заменил бы

Это почему-же? Все это вроде еще у Кнута описано.

SY.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731180
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Одно значение может быть получено разными выражениями. Не проще ли всегда вызывать обертку, которая проверяет (результ_) кеш.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731202
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-SY,

Одно значение может быть получено разными выражениями. Не проще ли всегда вызывать обертку, которая проверяет (результ_) кеш.

Я не обсуждаю "оптимальность" приведeнного SQL (на что намекнул Elic) а просто отвечаю (рассуждаю) на вопрос оптимизации SQL'ом вычисления повторяющихся выражений (не включающие в себя UDF).

SY.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731223
IAmAllan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, друзья, коллеги!
Мне же действительно интересно было, как там оно в этом случае с оптимизацией.И всё.
Но узнал много интересного из обсуждения, спасибо)
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731242
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYxtenderнет, не заменил бы

Это почему-же? Все это вроде еще у Кнута описано.

SY.я уже где-то это показывал детально, но лень искать... лучше стандартное напомню:
Код: 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.
27.
28.
29.
30.
SQL> create or replace function f return varchar2 deterministic as
  2  begin
  3     dbms_output.put_line('fired');
  4     return 'f';
  5  end;
  6  /

Function created.

SQL> select
  2    substr(a,1,3),
  3    substr(a,1,3),
  4    substr(a,1,3),
  5    substr(a,1,3),
  6    substr(a,1,3)
  7  from (
  8       select f as a
  9       from dual
 10       )
 11  ;

SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3
------------ ------------ ------------ ------------ ------------
f            f            f            f            f

fired
fired
fired
fired
fired
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731252
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderя уже где-то это показывал детально, но лень искать... лучше стандартное напомню:


Два, на мой взгляд, разных механизма. Во-первых, deterministic появился в Oracle совсем не из-за оптимизации числа выполнений а для пoддержки FBI по UDF. Оптимизация числа выполнений появилась кажется в 10G. Во-вторых оптимизации числа выполнений не связана напрямую с числом обращений к UDF. Но вернемся к UDF. UDF, как и любой PL/SQL нетранзакционна и мы по-определению должны вызывать UDF при каждой на неё ссылке. Посему до того как появилась оптимизации числа выполнений deterministic UDF парсер просто не мог применять механизм "вычисляем выражение один раз на строку" к UDF. И я очень сомнeваюсь, да и твой пример тому подтверждение, Oracle бросился переписывать SQL парсер с решением оптимизации числa вызовов deterministic UDF. Просто создали кеш значения в который добавляются неясно как и когда (internal implementation) и этот механизм кеширования не гарантирует что UDF не будет вызвана при повторном выполнении - просто число выполнений deterministic UDF может уменьшиться. Так-что, IMHO, два разных механизма. Да и вообще все это академический интерес...

SY.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731259
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderSYпропущено...


Это почему-же? Все это вроде еще у Кнута описано.

SY.я уже где-то это показывал детально, но лень искать... лучше стандартное напомню:
Код: 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.
27.
28.
29.
30.
SQL> create or replace function f return varchar2 deterministic as
  2  begin
  3     dbms_output.put_line('fired');
  4     return 'f';
  5  end;
  6  /

Function created.

SQL> select
  2    substr(a,1,3),
  3    substr(a,1,3),
  4    substr(a,1,3),
  5    substr(a,1,3),
  6    substr(a,1,3)
  7  from (
  8       select f as a
  9       from dual
 10       )
 11  ;

SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3 SUBSTR(A,1,3
------------ ------------ ------------ ------------ ------------
f            f            f            f            f

fired
fired
fired
fired
fired

Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
tst> set serveroutput on
tst> create or replace function f return varchar2 deterministic as
  2  begin
  3     dbms_output.put_line('fired');
  4     return 'f';
  5  end;
  6  /

Function created.

tst> select
  2    substr(a,1,3),
  3    substr(a,1,3),
  4    substr(a,1,3),
  5    substr(a,1,3),
  6    substr(a,1,3)
  7  from (
  8       select f as a
  9       from dual
 10       )
 11  ;

SUB SUB SUB SUB SUB
--- --- --- --- ---
f   f   f   f   f

fired
fired
fired
fired
fired
tst> select
  2    substr(a,1,3),
  3    substr(a,1,3),
  4    substr(a,1,3),
  5    substr(a,1,3),
  6    substr(a,1,3)
  7  from (
  8       select f as a
  9       from dual
 10       where rownum=1
 11       )
 12  ;

SUB SUB SUB SUB SUB
--- --- --- --- ---
f   f   f   f   f

fired
tst> 

Это все-таки другая ситуация

И опять же -- INSTR встроенная SQL функция, можно сказать, часть языка. Простор для оптимизации на этапе парсинга огромный
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39731278
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYДа и вообще все это академический интерес...Oracle-таки не стоит на месте.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> define func = "regexp_substr(s, '((.*)*)*#')"
SQL> with t as (select /*+ materialize */ 'qwertyuiopasdf' as s from dual)
  2  select * from t
  3    where &func = 'zzz';

no rows selected

Elapsed: 00:00:05.09
SQL> with t as (select /*+ materialize */ 'qwertyuiopasdf' as s from dual)
  2  select * from t
  3    where &func = 'zzz'
  4       or &func = 'ddd';

no rows selected

Elapsed: 00:00:10.19

Начиная с 12cR2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0

SQL> define func = "regexp_substr(s, '((.*)*)*#')"
SQL> with t as (select /*+ materialize */ 'qwertyuiopasdf' as s from dual)
  2  select * from t
  3    where &func = 'zzz';

no rows selected

Elapsed: 00:00:05.70
SQL> with t as (select /*+ materialize */ 'qwertyuiopasdf' as s from dual)
  2  select * from t
  3    where &func = 'zzz'
  4       or &func = 'ddd';

no rows selected

Elapsed: 00:00:05.28

Может поэтому:
Код: plsql
1.
2.
   4 - filter(SYS_OP_CSEE( REGEXP_SUBSTR ("S",'((.*)*)*#'))='zzz' OR SYS_OP_CSEE( REGEXP_SUBSTR
              ("S",'((.*)*)*#'))='ddd')

Пока не гуглится.
...
Рейтинг: 0 / 0
Насколько Oracle умён в плане оптимизации вычислений?
    #39733017
Алекссс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicOracle-таки не стоит на месте.

эт точно, на 11.2 секунд 10 отрабатывается
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Насколько Oracle умён в плане оптимизации вычислений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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