Preparando o Oracle Database para o Exadata Machine Utilizando o Exadata Simulation (Parte I)

É possível estimar os benefícios do Exadata, sem estar no Exadata?

O Exadata conta com uma série de recursos (físicos e lógicos) que fazem com que a máquina trabalhe com notável desempenho, capacidade e mestria, executando atividades de maneira como nenhuma outra existente hoje no mercado para banco de dados.

O próprio Infiniband, que é um padrão de comunicação interconnect (db nodes e storage cells) que desempenha um excelente throughput de dados entre os servidores. Podemos listar outras features como o Smart Scan, Smart Flash, Storage Index, Column Projection, Offloading De Dados e Predicate Filtering, todas elas mudam completamente a forma como uma instrução é tratada no Exadata.

A abordagem ideal em uma migração não-Exadata para Exadata, seria trabalhar em um cenário real: executar todas as cargas e processos do seu database no próprio hardware Exadata e comparar os resultados obtidos. Infelizmente, nem todos tem o privilégio de ter uma máquina dessas encostada no DataCenter, só para realizar esse tipo de teste. Muita das vezes, o esforço, tempo, planejamento e principalmente o investimento para se obter um teste desse, acaba não sendo justificado.

Pensando em tudo isso, a Oracle a partir do Oracle Database 11g Release 2, adicionou no SQL Performance Analyzers (SPA) a possibilidade de processar sua carga de trabalho real em um “simulador do storage cell”.

A ideia basicamente consiste em coletar a sua carga de trabalho e deixar armazenado em um SQL Tuning Set (SQLTSET). O SPA então executa o SQLTSET duas vezes, a primeira execução é processada normalmente sem nenhum alteração no banco de dados, já a segunda ele ativa o modo “cell storage simulation” e registra as informações obtidas. Após as duas execuções, o SPA avalia a mudança de comportamento através da coluna io_interconnect_bytes (v$SQL), apresentando no final um relatório com a comparação das duas execuções.

Com esse tipo de relatório em mãos, fica fácil de responder algumas perguntas como:

  • Como será o desempenho do Exadata com a minha carga de trabalho atual?
  • Será que o Exadata, é a máquina certa para o meu ambiente?
  • Os ganhos da performance do Exadata serão grandes o bastante para justificar o custo dessa máquina?

O Exadata simulation tem a capacidade de suportar apenas cargas de trabalhos de DW e DSS. O segredo do molho do Exadata nos ambientes OLTP é o acesso ao Smart Flash Cache. Como o Exadata Simulation não consegue calcular/reproduzir os acessos de blocos via Flash, torna a sua utilização nesse caso para cargas OLTP inviável de ser testado e não costumam apresentar grande mudanças de comportamento. Já cargas do estilo DW/DSS, que contém um alto número de acessos, grande retorno de linhas e um elevados full scans nas tabelas/indexes, torna o melhor candidato para ser reproduzido no Exadata Simulation.

Capturando os dados

É possível capturar os dados para o SQLSET, de duas formas:

1) Snapshot do AWR.

Nesse caso, você captura os dados de uma carga que aconteceu no passado via snapshot do AWR:

sys@sl01$1 SQL> COLUMN snaphist_begin_time      HEADING BEGIN_TIME    FORMAT a28 
sys@sl01$1 SQL> COLUMN snaphist_end_time        HEADING END_TIME      FORMAT a28 
sys@sl01$1 SQL> COLUMN snaphist_snap_id         HEADING SNAP_ID       FORMAT 999999
sys@sl01$1 SQL> COLUMN snaphist_dbid            HEADING DBID          FORMAT 99999999999
sys@sl01$1 SQL> COLUMN snaphist_inst_id         HEADING INST_ID       FORMAT 999999
sys@sl01$1 SQL> SELECT DISTINCT
2    dbid snaphist_dbid,
3    snap_id snaphist_snap_id, 
4    TO_CHAR(begin_interval_time, 'DD/MM/YYYY  HH24:MI') snaphist_begin_time,
5    TO_CHAR(end_interval_time, 'DD/MM/YYYY  HH24:MI') snaphist_end_time,
6    error_count
7    FROM dba_hist_snapshot
8    WHERE end_interval_time 
9    BETWEEN TO_TIMESTAMP('18-06-2016 00:00:00',  'DD-MM-YYYY HH24:MI:SS') 
AND TO_TIMESTAMP('20-06-2016 23:59:59', 'DD-MM-YYYY  HH24:MI:SS')
10    ORDER BY snaphist_dbid, snaphist_snap_id,  2;

DBID                  SNAP_ID  BEGIN_TIME                  END_TIME                      ERROR_COUNT
------------------- ---------  --------------------------  ---------------------------- ------------
3642494801              19504  18/06/2016 00:00             18/06/2016 00:15                       0
                        19505  18/06/2016 00:15             18/06/2016 00:30                       
      19715  20/06/2016 04:45             20/06/2016 05:00                       0
      19716  20/06/2016 05:00             20/06/2016 05:15                       0
      19717  20/06/2016 05:15             20/06/2016 05:30                       0
      19718  20/06/2016 05:30             20/06/2016 05:45                       0
      19719  20/06/2016 05:45             20/06/2016 06:00                       0
      19720  20/06/2016 06:00             20/06/2016 06:15                       0
      19721  20/06/2016 06:15             20/06/2016 06:30                       0
      19722  20/06/2016 06:30             20/06/2016 06:45                       0
      19723  20/06/2016 06:45             20/06/2016 07:00                       0
      19724  20/06/2016 07:00             20/06/2016 07:15                       0
      19725  20/06/2016 07:15             20/06/2016 07:30                       0
      19726  20/06/2016 07:30             20/06/2016 07:45                       0
      19727  20/06/2016 07:45             20/06/2016 08:00                       0
      19728  20/06/2016 08:00             20/06/2016 08:15                       0
      19729  20/06/2016 08:15             20/06/2016 08:30                       0
      19730  20/06/2016 08:30             20/06/2016 08:45                       0
      19731  20/06/2016 08:45             20/06/2016 09:00                       0
      19732  20/06/2016 09:00             20/06/2016 09:15                       0
      19733  20/06/2016 09:15             20/06/2016 09:30                       0
      19734  20/06/2016 09:30             20/06/2016 09:45                       0
      19735  20/06/2016 09:45             20/06/2016 10:00                       0
      19736  20/06/2016 10:00             20/06/2016 10:15                       0
      19737  20/06/2016 10:15             20/06/2016 10:30                       0
      19738  20/06/2016 10:30             20/06/2016 10:45                       0
      19739  20/06/2016 10:45             20/06/2016 11:00                       0
      19740  20/06/2016 11:00             20/06/2016 11:15                       0
      19741  20/06/2016 11:15             20/06/2016 11:30                       0
      19742  20/06/2016 11:30             20/06/2016 11:45                       0
      19743  20/06/2016 11:45             20/06/2016 12:00                       0
      19744  20/06/2016 12:00             20/06/2016 12:15                       0
      19745  20/06/2016 12:15             20/06/2016 12:30                       0
      19746  20/06/2016 12:30             20/06/2016 12:45                       0
      19747  20/06/2016 12:45             20/06/2016 13:00                       0
      19748  20/06/2016 13:00             20/06/2016 13:15                       0
      19749  20/06/2016 13:15             20/06/2016 13:30                       0
      19750  20/06/2016 13:30             20/06/2016 13:45                       0
      19751  20/06/2016 13:45             20/06/2016 14:00                       0
      19752  20/06/2016 14:00             20/06/2016 14:15                       0
      19753  20/06/2016 14:15             20/06/2016 14:30                       0
      19754  20/06/2016 14:30             20/06/2016 14:45                       0
      19755  20/06/2016 14:45             20/06/2016 15:00                       0
      19756  20/06/2016 15:00             20/06/2016 15:15                       0
      19757  20/06/2016 15:15             20/06/2016 15:30                       0
      19758  20/06/2016 15:30             20/06/2016 15:45                       0
      19759  20/06/2016 15:45             20/06/2016 16:00                       0
      19760  20/06/2016 16:00             20/06/2016 16:15                       0
      19761  20/06/2016 16:15             20/06/2016 16:30                       0
      19762  20/06/2016 16:30             20/06/2016 16:45                       0
      19763  20/06/2016 16:45             20/06/2016 17:00                       0
      19764  20/06/2016 17:00             20/06/2016 17:15                       0
      19765  20/06/2016 17:15             20/06/2016 17:30                       0
      19766  20/06/2016 17:30             20/06/2016 17:45                       0
      19767  20/06/2016 17:45             20/06/2016 18:00                       0
      19768  20/06/2016 18:00             20/06/2016 18:15                       0
      19769  20/06/2016 18:15             20/06/2016 18:30                       0
      19770  20/06/2016 18:30             20/06/2016 18:45                       0
      19771  20/06/2016 18:45             20/06/2016 19:00                       0
      19772  20/06/2016 19:00             20/06/2016 19:15                       0
      19773  20/06/2016 19:15             20/06/2016 19:30                       0
      19774  20/06/2016 19:30             20/06/2016 19:45                       0
      19775  20/06/2016 19:45             20/06/2016 20:00                       0
      19776  20/06/2016 20:00             20/06/2016 20:15                       0
      19777  20/06/2016 20:15             20/06/2016 20:30                       0
      19778  20/06/2016 20:30             20/06/2016 20:45                       0
      19779  20/06/2016 20:45             20/06/2016 21:00                       0
      19780  20/06/2016 21:00             20/06/2016 21:15                       0
      19781  20/06/2016 21:15             20/06/2016 21:30                       0
      19782  20/06/2016 21:30             20/06/2016 21:45                       0
      19783  20/06/2016 21:45             20/06/2016 22:00                       0
      19784  20/06/2016 22:00             20/06/2016 22:15                       0
      19785  20/06/2016 22:15             20/06/2016 22:30                       0
      19786  20/06/2016 22:30             20/06/2016 22:45                       0
      19787  20/06/2016 22:45             20/06/2016 23:00                       0
      19788  20/06/2016 23:00             20/06/2016 23:15                       0
      19789  20/06/2016 23:15             20/06/2016 23:30                       0
      19790  20/06/2016 23:30             20/06/2016 23:45                       0

288 rows selected.

sys@sl01$1 SQL>

Veja que estou solicitando todos os snapshots entre os dias 18 e 20. A partir disso, iniciamos a captura do workload desse intervalo de tempo.

sys@sl01$1 SQL> exec DBMS_SQLTUNE.CREATE_SQLSET('EXA_SQLSET01');
PL/SQL procedure successfully completed.
sys@sl01$1 SQL> DECLARE
2    baseline_ref_cursor  DBMS_SQLTUNE.SQLSET_CURSOR;
3    BEGIN
4       OPEN baseline_ref_cursor FOR
5     select VALUE(p) from  
TABLE(DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(19504, 19790, NULL, NULL, NULL,  NULL, NULL, NULL, NULL, 'ALL')) p;
6  
7       DBMS_SQLTUNE.LOAD_SQLSET('EXA_SQLSET01',  baseline_ref_cursor);
8     END;
9    /

PL/SQL procedure successfully completed.

Temos agora, o nosso SQLSET criado a partir dos snapshots 19504 e 19790.

Conferindo…

sys@sl01$1 SQL> select id, name, owner, created, last_modified, statement_count 
                from DBA_SQLSET ORDER BY id, created;

      ID NAME                     OWNER                   CREATED             LAST_MODIFIED       STATEMENT_COUNT
-------- ------------------------ ----------------------- ------------------- ------------------- ---------------
       3 EXA_SQLSET01             SYS                     21/06/2016 07:36:37 21/06/2016 07:40:12             475

2) Carga de trabalho atual – Cursor Cache

Outra maneira de capturar o workload do seu database é através do cursor de dados. Nesse método nada mais é do que ativar um tempo estimado e deixar capturando as cargas em tempo real que está acontecendo no momento.

No exemplo abaixo, decidimos capturar o nosso SQL Tuning set baseado no workload de 2 horas do nosso database.

sys@sl01$1 SQL> BEGIN
2        DBMS_SQLTUNE.CREATE_SQLSET(sqlset_name=>'EXA_SQLSET02');
3  END;
4  /
PL/SQL procedure successfully completed.

sys@sl01$1 SQL> BEGIN
2         DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET (
3          sqlset_name     => 'EXA_SQLSET02',
4          time_limit      => 7200,
5          repeat_interval => 10
6  ); END;
7  /

PL/SQL procedure successfully completed.

Executando o Exadata Simulation – tcellsim.sql

Uma vez que o SQLSET está criado, o próximo passo é executar o Exadata Simulation através do script tcellsim.sql

O script tcellsim.sql fica localizado no $ORACLE_HOME/rdbms/admin do binário do Oracle.

Veja abaixo a execução:

sys@sl01$1 SQL> @?/rdbms/admin/tcellsim

10 Most active SQL tuning sets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

NAME                OWNER             SQL_COUNT  DESCP
------------------- ----------------- ---------- --------------------
EXA_SQLSET02        SYS               1598
 
Specify the name and owner of SQL tuning set to use
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for sts_name: EXA_SQLSET02
Enter value for sts_owner: SYS
 
>> SQL tuning set specified: EXA_SQLSET02 owned by SYS
 
Run Cell simulation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 1. create a spa analysis task to test cell simulation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Name of SPA analysis task: TASK_484
>> 2. Test execute statements with cell simulatin DISABLED
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 3. Test execute statements with cell simulation ENABLED
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 4. Compare peformance and generate analysis report
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

General Information
---------------------------------------------------------------------------------------------

Task Information:        Workload Information:
---------------------------------------------  ---------------------------------------------
Task Name    : TASK_484         SQL Tuning Set Name        : EXA_SQLSET02
Task Owner   : SYS              SQL Tuning Set Owner       : SYS
Description  :                  Total SQL Statement  Count  : 1598

Execution Information:
---------------------------------------------------------------------------------------------
Execution Name             : EXEC_462                  Started             : 06/21/2016 18:44:27
Execution Type             : COMPARE PERFORMANCE       Last Updated        : 06/21/2016 20:44:27
Description                :                           Global Time  Limit   : UNLIMITED
Scope                      : COMPREHENSIVE             Per-SQL Time Limit  : UNUSED
Status                     : COMPLETED                 Number of Errors    : 3
Number of Unsupported  SQL  : 2

Analysis Information:
---------------------------------------------------------------------------------------------
Before Change  Execution:                        After  Change Execution:
---------------------------------------------    ---------------------------------------------
Execution Name      : cell_simulation_DISABLED   Execution Name      : cell_simulation_ENABLED
Execution Type      : TEST EXECUTE               Execution Type      : TEST EXECUTE
Scope               : COMPREHENSIVE              Scope               : COMPREHENSIVE
Status              : COMPLETED                  Status              : COMPLETED
Started             : 06/21/2016 21:33:00        Started             : 06/21/2016 21:38:45
Last Updated        : 06/21/2016 21:38:43        Last Updated        : 06/21/2016 21:44:25
Global Time Limit   : UNLIMITED                  Global Time Limit   : UNLIMITED
Per-SQL Time Limit  : UNUSED                     Per-SQL Time Limit  : UNUSED
Number of Errors    : 3                          Number of Errors    : 3
 
---------------------------------------------
Comparison Metric: IO_INTERCONNECT_BYTES
------------------
Workload Impact Threshold:  1%
--------------------------
SQL Impact Threshold: 1%
----------------------
 
Report Summary
---------------------------------------------------------------------------------------------
Projected Workload Change Impact:
-------------------------------------------
Overall Impact      :   6.06%
Improvement Impact  :   18.50%
Regression Impact   :   -4.01%

SQL Statement Count
-------------------------------------------
SQL Category  SQL Count   Plan Change Count
Overall          1598                    0
Improved          340                    0
Regressed           2                    0
Unchanged        1251                    0
with Errors         3                    0
Unsupported         2                    0

Top 10 SQL Sorted by Absolute Value of Change Impact on the  Workload
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
|             |               | Impact on | Execution |  Metric     |   Metric     |   Impact |
| object_id   | sql_id        | Workload  | Frequency | Before     |    After     |   on SQL |
---------------------------------------------------------------------------------------------
| 12341       |  05quhx2czmaau |   7.41%   |        582 | 3987577734 |   93984294  |    97.64% |
| 98271       |  07n9yv8rac2qq |   4.22%   |         38 |   85698319 |    3989341   |   95.34% |
| 24183       |  09p5nmnfq5gwg |   2.19%   |         41 |        779 |          0   |     100% |
| 82348       |  0za8d11cxbpr2 |   -.09%   |       2317 |   53382262 |   59460726   |  -11.39% |
| 24210       |  00ajuu5902429 |  -3.22%   |      22122 |       3894 |          0   |     100% |
| 22349       |  10s3r3f17ccu3 |   -.02%   |        314 |    5505024 |     294712   |   94.70% |
| 18820       |  1gfaj4z5hn1kf |   -.02%   |    1234112 |   13153621 |      32768   |   99.75% |

-----------------------------------------------------------------------------------------
Note: time statistics are displayed in microseconds
---------------------------------------------------------------------------------------------

O Exadata Simulation executa o SQL Set duas vezes, assim como falamos e no final apresenta o report.

Várias consultas foram mensuradas pelo Exadata simulation com uma melhora significativa, como é o caso da consulta 05quhx2czmaau que apresentou uma melhoria de 97.64%. Outros sqlids como os 09p5nmnfq5gwg e 00ajuu5902429, o Exadata Simulation calcula uma melhora de 100%.

Como apresentamos acima, o Exadata Simulation é uma ótima ferramenta e de fácil acesso para avaliar o desempenho do seu banco de dados em um storage cell do Exadata (offloading de dados, rede infiniband, etc ..). É claro, que uma avaliação como essa não substituí um teste real em um HW Exadata com todas as features trabalhando em conjunto, mas é um ponto de partida para não trabalhar no escuro.

Deixe um comentário