Veamos un ejemplo:
SQL_9iR2> CREATE TABLE t
2 NOLOGGING
3 AS
4 SELECT level a, mod(level,3) b, level c
5 FROM dual
6 CONNECT BY level <= 10000000 ;
Table created.
Elapsed: 00:01:00.08
SQL_9iR2> CREATE UNIQUE INDEX t_abc_ASC_uq ON t ( a ASC, b ASC, c ASC ) NOLOGGING ;
Index created.
Elapsed: 00:00:31.05
SQL_9iR2> CREATE UNIQUE INDEX t_abc_DESC_uq ON t ( a DESC, b DESC, c DESC ) NOLOGGING ;
Index created.
SQL_9iR2> EXEC dbms_stats.gather_table_stats( ownname => USER,
tabname => 'T', cascade => TRUE ) ;
PL/SQL procedure successfully completed.
Elapsed: 00:02:59.03
Vemos que si obtenemos las estadísticas computadas en serial, tardamos 3 minutos. Veamos que sucede si realizamos lo mismo pero en paralelo...
SQL_9iR2> EXEC dbms_stats.gather_table_stats( ownname => USER,
tabname => 'T', cascade => TRUE , degree => 4 ) ;
Mientras se ejecuta éste procedimiento, podemos consultar la vista V$PX_PROCESS (en otra sesión) para ver si efectivamente estamos realizando una ejecución en paralelo...
SQL_9iR2> select * from v$px_process ;
SERV STATUS PID SPID SID SERIAL#
---- --------- ---------- ------------ ---------- ----------
P000 IN USE 48 19360 74 1093
P001 IN USE 60 19362 64 773
P002 IN USE 62 19364 12 4904
P003 AVAILABLE 70 19366
P004 IN USE 74 19368 86 447
5 rows selected.
Observamos que hay 4 procesos que se están utilizando (IN USE) para obtener las estadísticas en paralelo. Veamos que sucede cuando termina de ejecutarse el procedimiento y volvemos a consultar la vista.
PL/SQL procedure successfully completed.
Elapsed: 00:01:21.04
SQL_9iR2> select * from v$px_process ;
SERV STATUS PID SPID SID SERIAL#
---- --------- ---------- ------------ ---------- ----------
P000 AVAILABLE 48 19360
P001 AVAILABLE 60 19362
P002 AVAILABLE 62 19364
P003 AVAILABLE 70 19366
P004 AVAILABLE 74 19368
5 rows selected.
Los procesos que estaban en estado IN USE pasaron a estar AVAILABLE nuevamente y obtuvimos las estadísticas en 1 minuto 20 segundos!!!
No hay comentarios.:
Publicar un comentario