Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Насколько Oracle умён в плане оптимизации вычислений? / 14 сообщений из 14, страница 1 из 1
10.11.2018, 01:30
    #39730955
IAmAllan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
Есть строковое поле вида 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
10.11.2018, 08:42
    #39730972
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
IAmAllanСколько раз для каждой строки Oracle будет вычислять INSTR (fld, '/')?-ннадцать. А ты не там ищешь поле для оптимизации.
...
Рейтинг: 0 / 0
10.11.2018, 19:43
    #39731129
IAmAllan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
ElicIAmAllanСколько раз для каждой строки Oracle будет вычислять INSTR (fld, '/')?-ннадцать. А ты не там ищешь поле для оптимизации.

Про надцать догадываюсь. Просто интересно же, нет?
...
Рейтинг: 0 / 0
10.11.2018, 20:32
    #39731141
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
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
10.11.2018, 21:15
    #39731161
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
SYГрубо говоря, парсер бы заменил все INSTR (fld, '/') ссылками на одну и ту же временную переменнуюнет, не заменил бы
...
Рейтинг: 0 / 0
10.11.2018, 21:22
    #39731163
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
xtenderнет, не заменил бы

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

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

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

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

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

SY.
...
Рейтинг: 0 / 0
11.11.2018, 00:17
    #39731223
IAmAllan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
Господа, друзья, коллеги!
Мне же действительно интересно было, как там оно в этом случае с оптимизацией.И всё.
Но узнал много интересного из обсуждения, спасибо)
...
Рейтинг: 0 / 0
11.11.2018, 01:43
    #39731242
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
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
11.11.2018, 03:51
    #39731252
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
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
11.11.2018, 06:14
    #39731259
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
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
11.11.2018, 10:47
    #39731278
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
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
14.11.2018, 14:26
    #39733017
Алекссс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Насколько Oracle умён в плане оптимизации вычислений?
ElicOracle-таки не стоит на месте.

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


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