É 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.