Можем ли мы указать степень параллелизма динамически? - PullRequest
5 голосов
/ 23 августа 2011

У меня есть запрос SQL выбора, который использует параллелизм, что-то вроде этого

INSERT/*+ APPEND PARALLEL (tst, 6) */ INTO test_table tst
                (
                    **************
                    **************
                    **************
                )
    SELECT /*+  PARALLEL (a, 6) */ DISTINCT 
                    **************
                    **************
                    **************
         FROM src_table a;

Как вы можете видеть здесь, я жестко закодировал степень, но я не хочу этого делать, поскольку число процессоров не одинаково во всех БД, где выполняется этот код.

My requirement: Мне нужно запросить V$PARAMETER о доступном количестве процессоров и использовать значение как result-2 в моем запросе. Как то так ...

DECLARE
   degree        varchar2(1);
BEGIN
select value-2 INTO degree from v$parameter where name='cpu_count';

            INSERT/*+ APPEND PARALLEL (tst, degree) */ INTO test_table tst
            (
                **************
                **************
                **************
            )
SELECT /*+  PARALLEL (a, degree) */ DISTINCT 
                **************
                **************
                **************
     FROM src_table a;
END;

Но он не работает так, как я ожидал, и я вижу 32 параллельных потока, независимо от доступных процессоров. Это правильный способ сделать? Если нет, есть ли другое решение для моего требования?

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Vivek,

Вы можете использовать динамический SQL для построения оператора INSERT в функции или процедуре PL / SQL.Таким образом, вы можете использовать переменную "степень", которую вы уже получили.

Что-то вроде:

DECLARE
   degree varchar2(1); 
BEGIN 
   select value-2 
     INTO degree 
     from v$parameter
    where name='cpu_count';              

   EXECUTE IMMEDIATE('INSERT /*+ APPEND PARALLEL (tst, '||degree||') */ '||
                     '  INTO test_table tst ( '||
                     '       **************  '||
                     '       **************  '||
                     '       **************  '||
                     '  ) '||
                     'SELECT /*+  PARALLEL (a, '||degree||') */ '||
                     '       DISTINCT '||
                     '       ************** '||
                     '       ************** '||
                     '       ************** '||
                     '  FROM src_table a');
END; 
2 голосов
/ 24 августа 2011

Почему бы не использовать Oracle для автоматического определения параллелизма?

1 голос
/ 13 июля 2017

Почему бы не форсировать степень для сеанса с помощью:

alter session force parallel dml parallel <dop>;
alter session force parallel query parallel <dop>;

Без намеков вы можете детально определить гранулярный уровень, который вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...