powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Параллельное выполнение и пакетная функция
16 сообщений из 16, страница 1 из 1
Параллельное выполнение и пакетная функция
    #39939518
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею представление и пакет

Код: 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.
create or replace view sv_aa12 as
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          Last_Day(A.DREP)   DEND
                     from (select 
                                  --PARAMETERS.Drep  DREP
                                  To_Date('17-03-2020','DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),
        SCPROD as (select  *
                     from  ........... 
                  ),
        CCPROD as (
                   select *
                     from ............
                  ),
        SCREST as (select *
                     from ............
                  ),
        SCLIST as (
                   select G.*,
                          H.* 
                     from (select *
                             from SCPROD
                            union all
                           select *
                             from CCPROD
                          ) G
                     left join SCREST H
                       on (    H.SC=G.SC
                          )
                  )
select Sum(.....) F1,
       Max(.....) F2
  from SCLIST
 group by KIND

-------------------------------------
create or replace package PARAMETERS as
  function Drep  return Date     parallel_enable;
  function Refresh(sDrep  Date  :=Null
                  ) return Number parallel_enable; 
end PARAMETERS;

create or replace package body PARAMETERS as
  pDrep  Date                :=Null;      

  function Drep return Date parallel_enable
  as
  begin
    return pDrep;
  end;

  
  function Refresh(sDrep  Date  :=Null
                  ) return Number parallel_enable 
  as
  begin
    declare 
      i number;
    begin 
      pDrep :=sDrep; 
      return Null;
    end;
  end;

end PARAMETERS;



WITH-ы работают параллельно друг другу, производительность удовлетворяет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
------------------------------------
|*  6 |       TABLE ACCESS FULL                                    | T_CARD_PORTFOLIO            |  7994K|    60M|       |   415K  (1)| 00:00:33 |   KEY |     1 |        |      |            |
|   7 |    VIEW                                                    |                             |     1 |     6 |       |     2   (0)| 00:00:01 |       |       |        |      |            |
|   8 |     FAST DUAL                                              |                             |     1 |       |       |     2   (0)| 00:00:01 |       |       |        |      |            |
|   9 |   PX COORDINATOR                                           |                             |       |       |       |            |          |       |       |        |      |            |
|  10 |    PX SEND QC (ORDER)                                      | :TQ10006                    |  1601K|  3165M|       |  3531K  (1)| 00:04:36 |       |       |  Q1,06 | P->S | QC (ORDER) |
|  11 |     VIEW                                                   | SV_AA12                     |  1601K|  3165M|       |  3531K  (1)| 00:04:36 |       |       |  Q1,06 | PCWP |            |
|  12 |      SORT GROUP BY     
------------------------------------



Делаю замену константной переменной в With-е PARAMETER на функцию пакета PARAMETERS
(перед выполнением представления буду присваивать дату отчета из вне представления
PARAMETERS.Refresh(To_Date('17-03-2020','DD/MM/YYYY'))
)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                                                  
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          A.DREP             DEND
                     from (select 
                                  PARAMETERS.Drep  DREP
                                  --To_Date('17-03-2020','DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),



Как только такая замена происходит меняется план запроса - парал-ция отключается
Как устранить этот момент.

Спасибо !

P.S. - Pipelined Table Functions не предлагать
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939527
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Доброго дня господа !

Имею представление и пакет

Код: plsql
1.
2.
create or replace package body PARAMETERS as
  pDrep  Date                :=Null;




дoкaparallel_enable_clause

The parallel_enable_clause can appear only once in the function.

The function must not use session state, such as package variables, because those variables are not necessarily shared among the parallel execution servers.

SY.
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939531
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
HOME_X,

используй лучше sys_context
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939600
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
HOME_X
Доброго дня господа !

Имею представление и пакет

Код: plsql
1.
2.
create or replace package body PARAMETERS as
  pDrep  Date                :=Null;




дoкaparallel_enable_clause

The parallel_enable_clause can appear only once in the function.

The function must not use session state, such as package variables, because those variables are not necessarily shared among the parallel execution servers.


SY.

Принято - спасибо
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939601
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
HOME_X,

используй лучше sys_context


Creating an Application Context: Example
This example uses the PL/SQL package emp_mgmt, created in "Creating a Package: Example", which validates and secures the hr application. The following statement creates the context namespace hr_context and associates it with the package emp_mgmt:

CREATE CONTEXT hr_context USING emp_mgmt;

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

используй лучше sys_context


и типовые переменные привязать нельзя, только текст
Верно понимаю ?
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939611
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Creating an Application Context: Example
Создавать контекст нет необходимости. Тем более для "...попробую...".
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939654
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
HOME_X,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> exec dbms_session.set_context('clientcontext','dt', '2020-01-01');

PL/SQL procedure successfully completed.

SQL> select sys_context('clientcontext','dt') dt from dual;

DT
----------------------------------------------------
2020-01-01
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939868
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Относительно context - спасибо !

Возник вопрос по такому предложению парал-ция опять таки отключается
Замена константы на подзапрос к однострочной таблице
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          A.DREP             DEND
                     from (select 
                                   (select DREP from T1) DREP    -- просто таблица с одной записью
                                  --PARAMETERS.Drep  DREP
                                  --To_Date('17-03-2020','DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),




Спасибо
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939873
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
xtender,

Относительно context - спасибо !

Возник вопрос по такому предложению парал-ция опять таки отключается
Замена константы на подзапрос к однострочной таблице
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          A.DREP             DEND
                     from (select 
                                   (select DREP from T1) DREP    -- просто таблица с одной записью
                                  --PARAMETERS.Drep  DREP
                                  --To_Date('17-03-2020','DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),




Спасибо


Вопрос снят
Create table T1 () parallel
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39939930
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Не ясно - вынес первоначальную константу в пользовательскую функцию
Паралл-ция представления в плане оптимизации снова отключилась

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function myDate return date parallel_enable
as 
begin 
  return To_Date('17-03-2020','DD-MM-YYYY');
end;
-------------------------------------------------

create or replace view sv_aa12 as
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          Last_Day(A.DREP)   DEND
                     from (select 
                                  MyDate  DREP
                                  --To_Date('17-03-2020','DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),
.........................
.........................



Поясните причину
Что не так понимаю ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Functions in Parallel Queries
In a SELECT statement or a subquery in a DML or DDL statement, a user-written function may be executed in parallel in any of the following cases:

If it has been declared with the PARALLEL_ENABLE keyword

If it is declared in a package or type and has a PRAGMA RESTRICT_REFERENCES clause that indicates all of WNDS, RNPS, and WNPS

If it is declared with CREATE FUNCTION and the system can analyze the body of the PL/SQL code and determine that the code neither writes to the database nor reads or modifies package variables

Other parts of a query or subquery can sometimes execute in parallel even if a given function execution must remain serial.

Refer to Oracle Database Development Guide for information about the PRAGMA RESTRICT_REFERENCES clause and Oracle Database SQL Language Reference for information about the CREATE FUNCTION statement.




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

Добавлю - если вернуть НЕ дату (Number или String) - PX COORDINATOR включается

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function myChar return String parallel_enable
as 
begin 
  return '17-03-2020';
end;
-------------------------------------------------

create or replace view sv_aa12 as
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          Last_Day(A.DREP)   DEND
                     from (select 
                                  --MyDate  DREP
                                  To_Date(myChar,'DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),
.........................
.........................



Дату задавал разнообразно
return To_date('','')
return Sysdate
return Cast(... as date)
return Date '2020-03-17'

С чем это может быть связано ?
Спасибо
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39940046
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
HOME_X,

сейчас ты вообще не в ту сторону смотришь... Дело не в ограничениях функции, а в том как CBO строит план - очевидно, что он просто считает параллель не выгодной в определенных случаях. Делай 10053 и сравнивай
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39940062
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,
Не совсем Вас понял

Во всех случаях общая архитектура запроса неизменна

- первоначальном случае возвращал дату - PX - COORDNTATOR не работал
- последнем случае вернул стринг и привел к дате - PX - COORDNTATOR сработал

Для "развязки" по PL/SQL создана временная таблицы (Materialize) -
Но остальные конструкции без концептуальных изменений

"Делай 10053 и сравнивай" - имеете в виду context ?
Пока не имею привилегий на создание cnotext переменных, поговорю с админами
там буду смотреть что получиться

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

меняя функцию ты меняешь предикаты, меняются предикаты - меняется стоимость и, соответственно, план строится по-другому. Оптимизатор сам выбирает, выгоднее ли параллельный план, поэтому получай трассировку 10053 и сравнивай. На самом деле, мне бы хватило обычных эксплейнов с хинтами parallel, но тебе лучше смотреть и показывать именно трассировку
...
Рейтинг: 0 / 0
Параллельное выполнение и пакетная функция
    #39940074
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
HOME_X,
, поэтому получай трассировку 10053 и сравнивай


Принято - попробую востребовать (не админ базы к сожалению)

Текущее решение
Добавил в пакет функцию которая возвращает String

Код: 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.
create or replace view sv_aa12 as
with PARAMETER as (select /*+ Materialize 
                              No_Merge(A)
                          */
                          A.DREP,
                          Trunc(A.DREP,'MM') DBEG,
                          Last_Day(A.DREP)   DEND
                     from (select 
                                  --PARAMETERS.Drep  DREP
                                  To_Date(PARAMETERS.Srep,'DD-MM-YYYY') DREP
                             from DUAL
                          ) A
                  ),
-------------------------------------
create or replace package PARAMETERS as
  function Drep  return Date     parallel_enable;
  function Srep  return String   parallel_enable;

  function Refresh(sDrep  Date  :=Null
                  ) return Number parallel_enable; 
end PARAMETERS;

create or replace package body PARAMETERS as
  pDrep  Date                :=Null;      

  function Drep return Date parallel_enable
  as
  begin
    return pDrep;
  end;

  function Srep return String parallel_enable
  as
  begin
    return To_Char(pDrep,'DD-MM-YYYY');
  end;

  
  function Refresh(sDrep  Date  :=Null
                  ) return Number parallel_enable 
  as
  begin
    declare 
      i number;
    begin 
      pDrep :=sDrep; 
      return Null;
    end;
  end;

end PARAMETERS;



Запрос отработал параллельно, не смотря на использование пакетных переменных (pDrep)
Эти переменные заполнены единоразово и на протяжении сессии не меняют значение
Т.е. замечание не критично

Код: plsql
1.
2.
3.
The parallel_enable_clause can appear only once in the function.

The function must not use session state, such as package variables, because those variables are not necessarily shared among the parallel execution servers.




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


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