dbms_random в параллели


В документации к dbms_random сказано:
It will automatically initialize with the date, user ID, and process ID if no explicit initialization is performed.
Из данной фразы не очевидно, какой "process id" будет использоваться для инициализации в случае параллельного выполнения, поэтому приведу наглядный пример, показывающий независимость генератора dbms_random от "process id" слейва, то есть генерацию одинаковых значений в параллели:
with
 t  as ( select/*+ materialize */ level n from dual connect by level<=4000)
,t1 as (
         select--+ materialize parallel(t 4)
            dbms_random.string('x',4)
            ||';'
            ||(select sid||';'||process||';'||pid
               from v$session, v$process
               where sid=sys_context('USERENV','SID')
                 and PADDR=ADDR
                 and n>0
              ) f
         from t
)
,t2 as (
         select 
            t1.f
           ,count(*) over(partition by regexp_substr(f,'^[^;]+')) cnt
         from t1
)
select f
      ,regexp_substr(f,'[^;]+') rnd
      ,regexp_substr(f,'[^;]+',1,2) sid
      ,regexp_substr(f,'[^;]+',1,3) process
      ,regexp_substr(f,'[^;]+',1,4) pid
from t2 
where cnt>1
order by f

Результат:
FRNDSIDPROCESSPID
AARV;130;5472;30AARV130547230
AARV;68;2228;29AARV68222829
AC2R;130;5472;30AC2R130547230
AC2R;68;2228;29AC2R68222829
AC8O;130;5472;30AC8O130547230
AC8O;68;2228;29AC8O68222829
AKVZ;130;5472;30AKVZ130547230
AKVZ;68;2228;29AKVZ68222829
ALTQ;130;5472;30ALTQ130547230
ALTQ;68;2228;29ALTQ68222829
...............

Comments

Отправить комментарий