Oracle: Paralelismo Automático e CALIBRATE_IO

Para utilizar o paralelismo automático no 11gR2, com grau máximo de automação (com parallel statement queuing, e in-memory parallel execution), deve-se alterar o parâmetro PARALLEL_DEGREE_POLICY para AUTO.

Mas neste nível de automação, o Oracle Database precisa conhecer qual a velocidade, vazão e latência de seu I/O. Isto é feito através da PROCEDURE DBMS_RESOURCE_MANAGER.CALIBRATE_IO.

SQL> SHOW USER
USER é "SYS"
SQL> SHOW PARAMETER PARALLEL_DEGREE_POLICY

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
parallel_degree_policy               string      AUTO
SQL> SET AUTOTRACE ON
SQL> SELECT COUNT(*) FROM SCOTT.T;

  COUNT(*)
----------
   1880544

Plano de Execução
----------------------------------------------------------
Plan hash value: 2966233522

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |  7517   (2)| 00:01:31 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    |  1880K|  7517   (2)| 00:01:31 |
-------------------------------------------------------------------

Note
-----
   - automatic DOP: skipped because of IO calibrate statistics are missing

Estatísticas
----------------------------------------------------------
          1  recursive calls
          1  db block gets
      27137  consistent gets
      26941  physical reads
          0  redo size
        433  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

No comando abaixo…
DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);
… você está solicitando ao Oracle para verificar a velocidade, vazão e latência de seu I/O, e o informando que você possui 2 discos (1o parâmetro), e que o tempo máximo tolerado de latência é de 10 segundos (2o parâmetro). Os últimos 3 parâmetros do comando são de retorno, informando o número máximo de requisições de I/O que o sistema suporta, o número máximo de Megabytes por segundo suportado, e real latência média detectada.

Se você alterar o perfil de seu I/O (trocar de Storage, adicionar ou remover discos, implantar uma outra aplicação concorrente) você deve executar este procedimento novamente.

Após a execução da PROCEDURE, o paralelismo automático passa a ser considerado. O meu SELECT simples acabou não sendo beneficiado pelo paralelismo, pois o tempo de execução estimado dele, em segundos, é menor do que o valor do parâmetro PARALLEL_MIN_TIME_THRESHOLD.

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     lat  INTEGER;
  3     iops INTEGER;
  4     mbps INTEGER;
  5  BEGIN
  6     DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 20, iops, mbps, lat);
  7     DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);
  8     DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);
  9     DBMS_OUTPUT.PUT_LINE ('max_mbps = ' || mbps);
 10  END;
 11  /
max_iops = 66
latency  = 14
max_mbps = 35

Procedimento PL/SQL concluído com sucesso.

SQL> SELECT COUNT(*) FROM SCOTT.T;

  COUNT(*)
----------
   1880544

Plano de Execução
----------------------------------------------------------
Plan hash value: 2966233522

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |  7517   (2)| 00:00:02 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    |  1880K|  7517   (2)| 00:00:02 |
-------------------------------------------------------------------

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold

Estatísticas
----------------------------------------------------------
         57  recursive calls
          1  db block gets
      27212  consistent gets
      26945  physical reads
          0  redo size
        433  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

Controlling Automatic DOP, Parallel Statement Queuing, and In-Memory Parallel Execution

I/O Calibration Inside the Database

CALIBRATE_IO Procedure

2 comments

  1. Ola Portilho

    Ótimo post , como sempre! Recentemente precisei usar DBMS_RESOURCE_MANAGER.CALIBRATE_IO
    uma pena não ter visto teu post antes, teria me economizado muito tempo.
    Ainda gostaria só de comentar que o tempo de latência é em milliseconds e não em segundos!
    Um abraço!

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.