Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / параллельная функция / 10 сообщений из 10, страница 1 из 1
17.04.2019, 15:00
    #39802853
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
обязана быть pipelined ?
или можно как-то обойтись без?

я попробовал просто parallel_enabled, не выходит

нужно вот такое

запрос вида

Код: plsql
1.
2.
select /*+ parallel(t 8)*/ t.*, my_function(t.id)
from table t



чтобы функция выполнялась дочерними процессами сразу при чтении данных, а не координатором в конце

также, вопрос, как посмотреть где функция вызывается
а то в плане/трассировке я не смог найти
...
Рейтинг: 0 / 0
17.04.2019, 15:37
    #39802893
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
хмм...

вот тут пишут что parallel_enabled должно быть достаточно

https://blogs.oracle.com/datawarehousing/parallel-plsql-functions-and-global-temporary-tables-and-wrong-results

я делал аналогичный тест, только у меня функция в select, а не where
...
Рейтинг: 0 / 0
17.04.2019, 15:52
    #39802907
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
таки да, провел эксперимент, если перенести функцию в where
заметно что параллельно выполняется (в ~8 раз быстрее)

а как сделать чтобы в селект выполнялось ?
и почему так не работает ?
...
Рейтинг: 0 / 0
17.04.2019, 16:25
    #39802925
Swsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
nxx,

Если хочешь, чтобы запрос выполнялся в параллели, то и нужно хинтовать именно запрос.
...
Рейтинг: 0 / 0
17.04.2019, 16:49
    #39802949
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
Swsovnxx,

Если хочешь, чтобы запрос выполнялся в параллели, то и нужно хинтовать именно запрос.

в смысле ?

а тут разве нет ?

Код: sql
1.
2.
select /*+ parallel(t 8)*/ t.*, my_function(t.id)
from table t
...
Рейтинг: 0 / 0
17.04.2019, 16:52
    #39802955
Swsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
nxx,

Ты различаешь хинты для запроса от хинтов для таблицы?
...
Рейтинг: 0 / 0
17.04.2019, 17:42
    #39802995
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
Swsovnxx,

Ты различаешь хинты для запроса от хинтов для таблицы?

если имеется в виду вот так, то нет
в смысле, функция параллельно не работает

Код: sql
1.
2.
select /*+ parallel(8)*/ t.*, my_function(t.id)
from table t
...
Рейтинг: 0 / 0
18.04.2019, 00:21
    #39803092
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
nxxа то в плане/трассировке я не смог найтисмотри в секцию проекций. Если проекция функции в строке с параллельным выполнением, то там она и вычисляется. Даже без parallel_enable функция может выполняться в слейве:
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
SQL> create or replace function f_non_parallel(v in varchar2) return varchar2 as
  2  begin
  3     return sys_context('USERENV','SID')||':'||substr(v,1,1); -- возвращает SID
  4  end;
  5  /

Function created.

SQL> create or replace function f_parallel(v in varchar2) return varchar2 parallel_enable as
  2  begin
  3     return sys_context('USERENV','SID')||':'||substr(v,1,1); -- возвращает SID
  4  end;
  5  /

Function created.

SQL> select/*+ parallel(8) gather_plan_statistics */ f_non_parallel(o.spare4) f1,count(*) cnt from sys.obj$ o group by f_non_parallel(o.spare4);

F1                          CNT
-------------------- ----------
800:                       3288
20:                        3237
48:                        3469
805:                       2868
35:                        2743
43:                        3330
788:                       3079
801:                       3265

8 rows selected. -- видим, что 8 разных SID

SQL> select * from table(dbms_xplan.display_cursor('','','allstats last +projection'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------
SQL_ID  fksnmpzpms07d, child number 0
-------------------------------------
select/*+ parallel(8) gather_plan_statistics */
f_non_parallel(o.spare4) f1,count(*) cnt from sys.obj$ o group by
f_non_parallel(o.spare4)

Plan hash value: 1457023762

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |          |      1 |        |      8 |00:00:00.15 |       5 |       |       |          |
|   1 |  PX COORDINATOR          |          |      1 |        |      8 |00:00:00.15 |       5 |       |       |          |
|   2 |   PX SEND QC (RANDOM)    | :TQ10001 |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   3 |    HASH GROUP BY         |          |      0 |      1 |      0 |00:00:00.01 |       0 |  1452K|  1452K|  570K (0)|
|   4 |     PX RECEIVE           |          |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   5 |      PX SEND HASH        | :TQ10000 |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   6 |       HASH GROUP BY      |          |      0 |      1 |      0 |00:00:00.01 |       0 |  1452K|  1452K|  451K (0)|
|   7 |        PX BLOCK ITERATOR |          |      0 |  25279 |      0 |00:00:00.01 |       0 |       |       |          |
|*  8 |         TABLE ACCESS FULL| OBJ$     |      0 |  25279 |      0 |00:00:00.01 |       0 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   8 - access(:Z>=:Z AND :Z<=:Z)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "F_NON_PARALLEL"("O"."SPARE4")[4000], COUNT()[22], "F_NON_PARALLEL"("O"."SPARE4")[4000]
   2 - (#keys=0) "F_NON_PARALLEL"("O"."SPARE4")[4000], COUNT()[22], "F_NON_PARALLEL"("O"."SPARE4")[4000]
   3 - "F_NON_PARALLEL"("O"."SPARE4")[4000], COUNT()[22]
   4 - "F_NON_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   5 - (#keys=1) "F_NON_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   6 - "F_NON_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   7 - "O"."SPARE4"[VARCHAR2,1000]
   8 - "O"."SPARE4"[VARCHAR2,1000]


39 rows selected.

SQL> select/*+ parallel(8) gather_plan_statistics */ f_parallel(o.spare4) f1,count(*) cnt from sys.obj$ o group by f_parallel(o.spare4);

F1                          CNT
-------------------- ----------
48:                        3614
805:                       2842
35:                        3456
43:                        3379
788:                       2535
801:                       3149
800:                       2896
20:                        3408

8 rows selected. -- видим, что 8 разных SID

SQL> select * from table(dbms_xplan.display_cursor('','','allstats last +projection'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------
SQL_ID  3ztq7kcxzvbuz, child number 0
-------------------------------------
select/*+ parallel(8) gather_plan_statistics */ f_parallel(o.spare4)
f1,count(*) cnt from sys.obj$ o group by f_parallel(o.spare4)

Plan hash value: 1457023762

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |          |      1 |        |      8 |00:00:00.13 |       5 |       |       |          |
|   1 |  PX COORDINATOR          |          |      1 |        |      8 |00:00:00.13 |       5 |       |       |          |
|   2 |   PX SEND QC (RANDOM)    | :TQ10001 |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   3 |    HASH GROUP BY         |          |      0 |      1 |      0 |00:00:00.01 |       0 |  1452K|  1452K|  570K (0)|
|   4 |     PX RECEIVE           |          |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   5 |      PX SEND HASH        | :TQ10000 |      0 |      1 |      0 |00:00:00.01 |       0 |       |       |          |
|   6 |       HASH GROUP BY      |          |      0 |      1 |      0 |00:00:00.01 |       0 |  1484K|  1484K|  451K (0)|
|   7 |        PX BLOCK ITERATOR |          |      0 |  25279 |      0 |00:00:00.01 |       0 |       |       |          |
|*  8 |         TABLE ACCESS FULL| OBJ$     |      0 |  25279 |      0 |00:00:00.01 |       0 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   8 - access(:Z>=:Z AND :Z<=:Z)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "F_PARALLEL"("O"."SPARE4")[4000], COUNT()[22], "F_PARALLEL"("O"."SPARE4")[4000]
   2 - (#keys=0) "F_PARALLEL"("O"."SPARE4")[4000], COUNT()[22], "F_PARALLEL"("O"."SPARE4")[4000]
   3 - "F_PARALLEL"("O"."SPARE4")[4000], COUNT()[22]
   4 - "F_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   5 - (#keys=1) "F_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   6 - "F_PARALLEL"("O"."SPARE4")[4000], SYS_OP_MSR()[10]
   7 - "O"."SPARE4"[VARCHAR2,1000]
   8 - "O"."SPARE4"[VARCHAR2,1000]


38 rows selected.

...
Рейтинг: 0 / 0
19.04.2019, 10:25
    #39803781
nxx
nxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
xtendernxxа то в плане/трассировке я не смог найтисмотри в секцию проекций. Если проекция функции в строке с параллельным выполнением, то там она и вычисляется. Даже без parallel_enable функция может выполняться в слейве:

спасибо
сделал функцию как у вас - sid показывает один
видимо разница в том, что у вас group by, а у меня-то нет
...
Рейтинг: 0 / 0
19.04.2019, 12:15
    #39803887
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параллельная функция
nxx,

Group by вообще не причём. Без него тоже будет разные выдавать.
Rtsm report, или трассировку px trace покажи.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / параллельная функция / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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