powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / параллельная функция
10 сообщений из 10, страница 1 из 1
параллельная функция
    #39802853
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обязана быть pipelined ?
или можно как-то обойтись без?

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

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

запрос вида

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



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

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

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

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

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

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

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

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

в смысле ?

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

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

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

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

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

Код: sql
1.
2.
select /*+ parallel(8)*/ t.*, my_function(t.id)
from table t
...
Рейтинг: 0 / 0
параллельная функция
    #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
параллельная функция
    #39803781
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtendernxxа то в плане/трассировке я не смог найтисмотри в секцию проекций. Если проекция функции в строке с параллельным выполнением, то там она и вычисляется. Даже без parallel_enable функция может выполняться в слейве:

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

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


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