É comum ouvir outras pessoas dizendo que no Exadata não precisamos mais dos índices de banco de dados tradicionais pois o Exadata responde melhor sem eles e que podemos excluir todos os índices para liberar espaço no Storage. Na prática as coisas são um pouco diferentes, existem muitos cenários onde…
Exadata: Como obter as métricas do Smart Scan de uma consulta?
Quando uma instrução SQL é executada numa base Oracle utilizando uma plataforma tradicional (Unix-like, Microsoft,…) somos capazes de obter as estatísticas desta execução com detalhes suficientes para determinar onde está o gargalo desta instrução através do pacote DBMS_XPLAN. Na plataforma Exadata muitas funções são executadas no Storage Server durante a execução da instrução SQL e as estatísticas destas funções não estão disponíveis no pacote DBMS_XPLAN, portanto quando analisamos uma plano de execução de uma instrução SQL executada na plataforma Exadata muitas perguntas ficam sem resposta se utilizarmos exclusivamente este pacote:
1) Qual a quantidade de I/O físico real que foi realizada?
2) Quanto desse I/O foi leitura e quanto foi gravação?
3) Qual a quantidade de I/O que foi evitada devido ao recurso Flash Cache?
4) Qual a quantidade de I/O que foi evitada devido ao recurso Storage Indexes?
5) Qual foi o trafego total pelo Interconnect?
6) Qual a quantidade de dados que foi totalmente processada no Storage Server?
7) Qual a quantidade de dados que foi retornada para o Database Server pelo Smart Scan?
Neste artigo vamos fazer uma demonstração de uma ferramenta desenvolvida por Tanel Poder que fornece respostas para todos estas perguntas e permite a visualização de todas estas informações para instruções SQL executadas na plataforma Exadata, possibilitando uma analise de performance completa e a identificação de eventuais gargalos.
Roteiro da demonstração
Para demonstrar a utilização da ferramenta EXADATA SNAPPER vamos realizar a seguintes tarefas:
1) Baixar e instalar o EXADATA SNAPPER numa instância Oracle na plataforma Exadata
2) Criar uma tabela na instância
3) Executar uma consulta na tabela com algumas funções do Exadata desativada a nível de sessão
4) Executar a consulta novamente com as funções ativadas a nível de sessão
Baixar e instalar o EXADATA SNAPPER
1) Para instalação do EXADATA SNAPPER acesse o site http://blog.tanelpoder.com/files/ e clique no item 2. Download all my TPT scripts as a .zip file
Ajudo DBAs e analistas de sistema a se destacarem em suas empresas
e obter um crescimento mais acelerado em suas carreiras, quer saber mais click no link abaixo:
2) Descompacte o arquivo “tpt_public.zip” em um diretório no seu computador
3) Dentro desse diretório será criado o diretório “scripts” que contem outros diretórios, acesse o diretório exadata onde se encontra o script “exasnapper_install_latest.sql”
4) Para executar esse script de instalação o usuário do banco no qual será instalado o EXASNAPPER precisa ter as seguintes permissões:
Privilégio SELECT ANY DICTIONARY ou privilégio de SELECT nas visões GV$ referenciadas no script;
Privilégio EXECUTE no pacote SYS.DBMS_LOCK
5) Utilizando um cliente oracle conectado com o usuário que recebeu os privilégios acima, execute o script “exasnapper_install_latest.sql”
Criar uma tabela na instância
Para realizar a demonstração vamos criar um tabela com tamanho de 11GB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | SQL > SELECT * FROM V$VERSION where rownum < 2; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SQL > ALTER SESSION SET WORKAREA_SIZE_POLICY=MANUAL; Sessão alterada. SQL > ALTER SESSION SET SORT_AREA_SIZE=2000000000; Sessão alterada. SQL > CREATE TABLE dbtw01 AS 2 SELECT 'ABC'||LPAD(MOD(ROWNUM,40617473),80,0) AS texto, 3 mod(rownum,11) AS situacao, 4 'XPT'||LPAD(MOD(ROWNUM,4500),100,0) AS texto2, 5 'XYZ'||LPAD(MOD(ROWNUM+40000,787648),60,0) AS texto3, 6 SYSDATE-ROUND(ROWNUM/30,0) AS data_criacao 7 FROM dual CONNECT BY LEVEL<=40617473; Tabela criada. SQL > select round(bytes/1024/1024/1024,1) as "Tamanho GB" 2 from user_segments 3 where segment_name = 'DBTW01'; Tamanho GB ---------- 11,5 SQL > EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> USER, TABNAME=> 'DBTW01', CASCADE=> TRUE, METHOD_OPT=> 'FOR ALL COLUMNS SIZE SKEWONLY', DEGREE=>18); Procedimento PL/SQL concluído com sucesso. SQL > |
Consulta com as funções Exadata desativadas
Vamos executar uma consulta na tabela criada e inicialmente vamos desativar algumas funções a nível de sessão utilizando parâmetros não documentos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | SQL > SET TAB OFF; SQL > SQL > -- Permite a exibição das estatísticas de execução da consulta SQL > ALTER SESSION SET statistics_level = ALL; Sessão alterada. SQL > -- Desativa a função Storage Index do Exadata SQL > ALTER SESSION SET "_kcfis_storageidx_disabled" = TRUE; Sessão alterada. SQL > -- Desativa a leitura de blocos direta sem a passagem pelo Buffer Cache SQL > ALTER SESSION SET "_serial_direct_read" = FALSE; Sessão alterada. SQL > COL NAME FOR A300 SQL > SQL > -- Definição das variáveis que serão utilizadas no EXASNAPPER SQL > variable b NUMBER; SQL > variable e NUMBER; SQL > SQL > -- Gera um snapshot das estatisticas e atualiza a variavel "b" com o valor do snap_id antes da execução da consulta SQL > EXEC :b := exasnap.begin_snap; Procedimento PL/SQL concluído com sucesso. SQL > SELECT /* DBTW001 */ situacao, COUNT(1) qtde 2 FROM dbtw01 3 WHERE data_criacao BETWEEN SYSDATE-120 AND SYSDATE-30 4 OR data_criacao BETWEEN SYSDATE-720 AND SYSDATE-630 5 OR data_criacao BETWEEN SYSDATE-1320 AND SYSDATE-1230 6 OR data_criacao BETWEEN SYSDATE-1920 AND SYSDATE-1830 7 OR data_criacao BETWEEN SYSDATE-2520 AND SYSDATE-2430 8 GROUP BY situacao; SITUACAO QTDE ---------- ---------- 1 1228 6 1227 2 1227 4 1228 5 1228 8 1228 3 1227 7 1227 9 1227 10 1226 0 1227 11 linhas selecionadas. Decorrido: 00:00:04.79 SQL > -- Gera um snapshot das estatisticas e atualiza a variavel "e" com o valor do snap_id após da execução da consulta SQL > EXEC :e := exasnap.end_snap; Procedimento PL/SQL concluído com sucesso. SQL > -- Recupera o SQL_ID e o CHILD_NUMBER da consulta executada SQL > column sql_id new_value m_sql_id SQL > column child_number new_value m_child_no SQL > SELECT sql_id, child_number 2 FROM v$sql 3 WHERE sql_text LIKE '%DBTW001%' 4 AND sql_text NOT LIKE '%v$sql%'; SQL_ID CHILD_NUMBER ------------- ------------ fmwugmvdrxtuc 1 SQL > -- Gera o relatório do plano de execução da consulta SQL > SELECT * FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'typical iostats last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID fmwugmvdrxtuc, child number 1 ------------------------------------- SELECT /* DBTW001 */ situacao, COUNT(1) qtde FROM dbtw01 WHERE data_criacao BETWEEN SYSDATE-120 AND SYSDATE-30 OR data_criacao BETWEEN SYSDATE-720 AND SYSDATE-630 OR data_criacao BETWEEN SYSDATE-1320 AND SYSDATE-1230 OR data_criacao BETWEEN SYSDATE-1920 AND SYSDATE-1830 OR data_criacao BETWEEN SYSDATE-2520 AND SYSDATE-2430 GROUP BY situacao Plan hash value: 1822618879 ---------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads | ---------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 191K(100)| | 11 |00:00:04.67 | 1504K| 1504K| | 1 | HASH GROUP BY | | 1 | 11 | 121 | 191K (2)| 00:54:11 | 11 |00:00:04.67 | 1504K| 1504K| |* 2 | TABLE ACCESS STORAGE FULL| DBTW01 | 1 | 13799 | 148K| 191K (2)| 00:54:11 | 13500 |00:00:04.67 | 1504K| 1504K| ---------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - storage((("DATA_CRIACAO">=SYSDATE@!-120 AND "DATA_CRIACAO"<=SYSDATE@!-30) OR ("DATA_CRIACAO">=SYSDATE@!-720 AND "DATA_CRIACAO"<=SYSDATE@!-630) OR ("DATA_CRIACAO">=SYSDATE@!-1320 AND "DATA_CRIACAO"<=SYSDATE@!-1230) OR ("DATA_CRIACAO">=SYSDATE@!-1920 AND "DATA_CRIACAO"<=SYSDATE@!-1830) OR ("DATA_CRIACAO">=SYSDATE@!-2520 AND "DATA_CRIACAO"<=SYSDATE@!-2430))) filter((("DATA_CRIACAO">=SYSDATE@!-120 AND "DATA_CRIACAO"<=SYSDATE@!-30) OR ("DATA_CRIACAO">=SYSDATE@!-720 AND "DATA_CRIACAO"<=SYSDATE@!-630) OR ("DATA_CRIACAO">=SYSDATE@!-1320 AND "DATA_CRIACAO"<=SYSDATE@!-1230) OR ("DATA_CRIACAO">=SYSDATE@!-1920 AND "DATA_CRIACAO"<=SYSDATE@!-1830) OR ("DATA_CRIACAO">=SYSDATE@!-2520 AND "DATA_CRIACAO"<=SYSDATE@!-2430))) 31 linhas selecionadas. SQL > |
Examinando o plano de execução verificamos que a tabela foi lida utilizando a operação “TABLE ACCESS STORAGE FULL”, esta operação não garante que os dados foram recuperados do Storage Server utilizando o Smart Scan, mas quando presente indica que o Storage Server pode utilizar Smart Scan.
Da mesma forma devemos interpretar a existência da cláusula “storage()” na seção “Predicate Information”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | SQL > -- Gera o relatório com as estatísticas da consulta no Storage Server SQL > SELECT * FROM TABLE(exasnap.display_snap(:b, :e)); NAME -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ExaSnapper v0.81 BETA by Tanel Poder @ Enkitec - The Exadata Experts ( http://www.enkitec.com ) --------------------------------------------------------------------------------------------------------------------------------------------------------- DB_LAYER_IO DB_PHYSIO_BYTES |##################################################| 11753 MB 2007 MB/sec DB_LAYER_IO DB_PHYSRD_BYTES |##################################################| 11753 MB 2007 MB/sec DB_LAYER_IO DB_PHYSWR_BYTES | | 0 MB 0 MB/sec AVOID_DISK_IO PHYRD_FLASH_RD_BYTES | | 0 MB 0 MB/sec AVOID_DISK_IO PHYRD_STORIDX_SAVED_BYTES | | 0 MB 0 MB/sec REAL_DISK_IO SPIN_DISK_IO_BYTES |##################################################| 11753 MB 2007 MB/sec REAL_DISK_IO SPIN_DISK_RD_BYTES |##################################################| 11753 MB 2007 MB/sec REAL_DISK_IO SPIN_DISK_WR_BYTES | | 0 MB 0 MB/sec REDUCE_INTERCONNECT PRED_OFFLOADABLE_BYTES |##################################################| 11753 MB 2007 MB/sec REDUCE_INTERCONNECT TOTAL_IC_BYTES | | 2 MB 0 MB/sec REDUCE_INTERCONNECT SMART_SCAN_RET_BYTES | | 2 MB 0 MB/sec REDUCE_INTERCONNECT NON_SMART_SCAN_BYTES | | 0 MB 0 MB/sec CELL_PROC_DEPTH CELL_PROC_DATA_BYTES |##################################################| 11753 MB 2007 MB/sec CELL_PROC_DEPTH CELL_PROC_INDEX_BYTES | | 0 MB 0 MB/sec CLIENT_COMMUNICATION NET_TO_CLIENT_BYTES | | 0 MB 0 MB/sec CLIENT_COMMUNICATION NET_FROM_CLIENT_BYTES | | 0 MB 0 MB/sec 18 linhas selecionadas. SQL > |
No relatório gerado pelo EXASNAPPER temos as informações detalhadas do que ocorreu no STORAGE SERVER:
DB_LAYER_IO – DB_PHYSIO_BYTES
Quantidade de I/O em bytes que o banco de dados espera realizar com Storage Server baseado em seu dicionario de dados.
DB_LAYER_IO – DB_PHYSRD_BYTES
Quantidade de bytes que o banco de dados espera recuperar do Storage Server baseado em seu dicionario de dados.
REAL_DISK_IO – SPIN_DISK_IO_BYTES
Quantidade de I/O físico em bytes que o Storage Server realizou durante a execução consulta.
REAL_DISK_IO – SPIN_DISK_RD_BYTES
Quantidade de leitura física em bytes realizada pelo Storage Server durante a execução consulta.
REDUCE_INTERCONNECT – PRED_OFFLOADABLE_BYTES
Quantidade de bytes que pode ser processado a nível de Storage Server durante a execução consulta.
REDUCE_INTERCONNECT – TOTAL_IC_BYTES
Quantidade de bytes que trafegou pelo INTERCONNECT entre o Banco de dados e o Storage Server.
REDUCE_INTERCONNECT – SMART_SCAN_RET_BYTES
Quantidade de bytes que foi retornada para o banco de dados como resultado do processamento do Smart Scan.
CELL_PROC_DEPTH – CELL_PROC_DATA_BYTES
Quantidade de bytes de dados processados no Storage Server.
Consulta com as funções Exadata ativadas
Agora vamos executar a mesma consulta novamente, só que desta vez vamos ativar as funções que haviam sido desativadas na primeira execução.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | SQL > SET TAB OFF; SQL > SQL > -- Permite a exibição das estatísticas de execução da consulta SQL > ALTER SESSION SET statistics_level = ALL; Sessão alterada. SQL > -- Ativa a função Storage Index do Exadata SQL > ALTER SESSION SET "_kcfis_storageidx_disabled" = FALSE; Sessão alterada. SQL > -- Permite a leitura de blocos direta sem a passagem pelo Buffer Cache SQL > ALTER SESSION SET "_serial_direct_read" = AUTO; Sessão alterada. SQL > COL NAME FOR A300 SQL > SQL > -- Definição das variáveis que serão utilizadas no EXASNAPPER SQL > variable b NUMBER; SQL > variable e NUMBER; SQL > SQL > -- Gera um snapshot das estatisticas e atualiza a variavel "b" com o valor do snap_id antes da execução da consulta SQL > EXEC :b := exasnap.begin_snap; Procedimento PL/SQL concluído com sucesso. Decorrido: 00:00:00.84 SQL > SQL > SELECT /* DBTW003 */ situacao, COUNT(1) qtde 2 FROM dbtw01 3 WHERE data_criacao BETWEEN SYSDATE-120 AND SYSDATE-30 4 OR data_criacao BETWEEN SYSDATE-720 AND SYSDATE-630 5 OR data_criacao BETWEEN SYSDATE-1320 AND SYSDATE-1230 6 OR data_criacao BETWEEN SYSDATE-1920 AND SYSDATE-1830 7 OR data_criacao BETWEEN SYSDATE-2520 AND SYSDATE-2430 8 GROUP BY situacao; SITUACAO QTDE ---------- ---------- 1 1228 6 1227 2 1227 4 1228 5 1228 8 1228 3 1227 7 1227 9 1227 10 1226 0 1227 11 linhas selecionadas. SQL > -- Gera um snapshot das estatisticas e atualiza a variavel "e" com o valor do snap_id após da execução da consulta SQL > EXEC :e := exasnap.end_snap; Procedimento PL/SQL concluído com sucesso. SQL > -- Recupera o SQL_ID e o CHILD_NUMBER da consulta executada SQL > column sql_id new_value m_sql_id SQL > column child_number new_value m_child_no SQL > SELECT sql_id, child_number 2 FROM v$sql 3 WHERE sql_text LIKE '%DBTW003%' 4 AND sql_text NOT LIKE '%v$sql%'; SQL_ID CHILD_NUMBER ------------- ------------ 6cbrtk6rxvaz5 1 SQL > -- Gera o relatório do plano de execução da consulta SQL > SELECT * FROM TABLE (dbms_xplan.display_cursor ('&m_sql_id',&m_child_no,'typical iostats last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID 6cbrtk6rxvaz5, child number 1 ------------------------------------- SELECT /* DBTW003 */ situacao, COUNT(1) qtde FROM dbtw01 WHERE data_criacao BETWEEN SYSDATE-120 AND SYSDATE-30 OR data_criacao BETWEEN SYSDATE-720 AND SYSDATE-630 OR data_criacao BETWEEN SYSDATE-1320 AND SYSDATE-1230 OR data_criacao BETWEEN SYSDATE-1920 AND SYSDATE-1830 OR data_criacao BETWEEN SYSDATE-2520 AND SYSDATE-2430 GROUP BY situacao Plan hash value: 1822618879 ---------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads | ---------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 191K(100)| | 11 |00:00:00.05 | 1504K| 1504K| | 1 | HASH GROUP BY | | 1 | 11 | 121 | 191K (2)| 00:54:11 | 11 |00:00:00.05 | 1504K| 1504K| |* 2 | TABLE ACCESS STORAGE FULL| DBTW01 | 1 | 13799 | 148K| 191K (2)| 00:54:11 | 13500 |00:00:00.05 | 1504K| 1504K| ---------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - storage((("DATA_CRIACAO">=SYSDATE@!-120 AND "DATA_CRIACAO"<=SYSDATE@!-30) OR ("DATA_CRIACAO">=SYSDATE@!-720 AND "DATA_CRIACAO"<=SYSDATE@!-630) OR ("DATA_CRIACAO">=SYSDATE@!-1320 AND "DATA_CRIACAO"<=SYSDATE@!-1230) OR ("DATA_CRIACAO">=SYSDATE@!-1920 AND "DATA_CRIACAO"<=SYSDATE@!-1830) OR ("DATA_CRIACAO">=SYSDATE@!-2520 AND "DATA_CRIACAO"<=SYSDATE@!-2430))) filter((("DATA_CRIACAO">=SYSDATE@!-120 AND "DATA_CRIACAO"<=SYSDATE@!-30) OR ("DATA_CRIACAO">=SYSDATE@!-720 AND "DATA_CRIACAO"<=SYSDATE@!-630) OR ("DATA_CRIACAO">=SYSDATE@!-1320 AND "DATA_CRIACAO"<=SYSDATE@!-1230) OR ("DATA_CRIACAO">=SYSDATE@!-1920 AND "DATA_CRIACAO"<=SYSDATE@!-1830) OR ("DATA_CRIACAO">=SYSDATE@!-2520 AND "DATA_CRIACAO"<=SYSDATE@!-2430))) 31 linhas selecionadas. SQL > |
Comparando os dois planos de execução acima verificamos que quase todas as informações geradas nos relatórios dos planos de execução são idênticas, a unica exceção é o tempo real de execução da consulta que diminuiu de 4,67 segundos para 5 centésimos de segundo. Para descobrir o por que desta redução drástica no tempo de execução da consulta precisamos analisar as informações geradas pelo EXASNAPPER.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | SQL > -- Gera o relatório com as estatísticas da consulta no Storage Server SQL > SELECT * FROM TABLE(exasnap.display_snap(:b, :e)); NAME -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- ExaSnapper v0.81 BETA by Tanel Poder @ Enkitec - The Exadata Experts ( http://www.enkitec.com ) --------------------------------------------------------------------------------------------------------------------------------------------------------- DB_LAYER_IO DB_PHYSIO_BYTES |##################################################| 11753 MB 10750 MB/sec DB_LAYER_IO DB_PHYSRD_BYTES |##################################################| 11753 MB 10750 MB/sec DB_LAYER_IO DB_PHYSWR_BYTES | | 0 MB 0 MB/sec AVOID_DISK_IO PHYRD_FLASH_RD_BYTES | | 1 MB 1 MB/sec AVOID_DISK_IO PHYRD_STORIDX_SAVED_BYTES |##################################################| 11744 MB 10742 MB/sec REAL_DISK_IO SPIN_DISK_IO_BYTES | | 8 MB 7 MB/sec REAL_DISK_IO SPIN_DISK_RD_BYTES | | 8 MB 7 MB/sec REAL_DISK_IO SPIN_DISK_WR_BYTES | | 0 MB 0 MB/sec REDUCE_INTERCONNECT PRED_OFFLOADABLE_BYTES |##################################################| 11753 MB 10750 MB/sec REDUCE_INTERCONNECT TOTAL_IC_BYTES | | 0 MB 0 MB/sec REDUCE_INTERCONNECT SMART_SCAN_RET_BYTES | | 0 MB 0 MB/sec REDUCE_INTERCONNECT NON_SMART_SCAN_BYTES | | 0 MB 0 MB/sec CELL_PROC_DEPTH CELL_PROC_DATA_BYTES | | 9 MB 8 MB/sec CELL_PROC_DEPTH CELL_PROC_INDEX_BYTES | | 0 MB 0 MB/sec CLIENT_COMMUNICATION NET_TO_CLIENT_BYTES | | 0 MB 0 MB/sec CLIENT_COMMUNICATION NET_FROM_CLIENT_BYTES | | 0 MB 0 MB/sec 18 linhas selecionadas. SQL > |
No relatório gerado pelo EXASNAPPER temos as informações detalhadas do que ocorreu no STORAGE SERVER:
DB_LAYER_IO – DB_PHYSIO_BYTES
Quantidade de I/O em bytes que o banco de dados espera realizar com Storage Server baseado em seu dicionario de dados.
DB_LAYER_IO – DB_PHYSRD_BYTES
Quantidade de bytes que o banco de dados espera recuperar do Storage Server baseado em seu dicionario de dados.
AVOID_DISK_IO – PHYRD_FLASH_RD_BYTES
Quantidade de bytes lida direto do Flash Cache.
AVOID_DISK_IO – PHYRD_STORIDX_SAVED_BYTES
Quantidade de bytes que não foi lida devido a utilização da função Storage Indexes.
REAL_DISK_IO – SPIN_DISK_IO_BYTES
Quantidade de I/O físico em bytes que o Storage Server realizou durante a execução consulta.
REAL_DISK_IO – SPIN_DISK_RD_BYTES
Quantidade de leitura física em bytes realizada pelo Storage Server durante a execução consulta.
CELL_PROC_DEPTH – CELL_PROC_DATA_BYTES
Quantidade de bytes de dados processada no Storage Server.
Conclusão
Comparando as estatísticas dos relatórios EXASNAPPER das duas execuções da consulta, conseguimos entender claramente por que a segunda execução foi muito mais rápida:
1) Na primeira execução da consulta podemos verificar através da categoria REAL_DISK_IO que o Storage Server fez a leitura física de 11.753 MB de dados e na segunda execução se observarmos a categoria AVOID_DISK_IO verificamos que 11.744 MB simplesmente foram ignorados pelo Storage Server devido a ação da função Storage Indexes que evita a leitura de blocos físicos quando estes não contem os dados que atendem aos critérios do filtro da cláusula WHERE. Os demais blocos de dados da segunda execução (9 MB) foram acessados da seguinte forma:
- 1 MB foi leitura do Flash Cache (Categoria: AVOID_DISK_IO, tipo: PHYRD_FLASH_RD_BYTES)
- 8 MB foi leitura física (Categoria: REAL_DISK_IO, tipo: SPIN_DISK_RD_BYTES)
2) Outra estatística que teve grande influência no tempo de execução da consulta foi a quantidade de blocos de dados processada pelo Storage Server. Na categoria CELL_PROC_DEPTH verificamos que na primeira execução o Storage Server processou 11.753 MB, enquanto na segunda execução foram somente 9 MB.
3) Finalmente na Categoria REDUCE_INTERCONNECT verificamos que na primeira execução o Storage Server retornou para o Database Server 2 MB, já na segunda execução não houve a necessidade dessa transferência pois o Storage Server retornou para o Database Server o resultado final esperado pela consulta.
Referências
http://blog.tanelpoder.com/2013/02/22/exasnapper-0-7-beta-download-and-the-hacking-session-videos/