Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Miniseminario fetch size

707 views

Published on

This presentation explains the importance of set up the transaction fetch size. by doing this the underlying database protocol can easily calculate the correct tcp window and avoid to waste bandwidth and time.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Miniseminario fetch size

  1. 1. <ul>Fetch Size </ul><ul>Ganhe desempenho, pergunte-me como </ul>
  2. 2. <ul>Conexão com o banco </ul><ul><ul><li>Abrir conexões é &quot;caro&quot;
  3. 3. Recursos gerenciados pelo servidor
  4. 4. Abstração JDBC/JPA X Conhecimento a nível de protocolo
  5. 5. Time-to-Market
  6. 6. Desempenho </li></ul></ul>
  7. 7. <ul>Fetch Size </ul><ul>     É a quantidade esperada de resultados. quando informada, muito o Oracle (e outros bancos!) envia as informações de forma diferente.     JDBC esconde os detalhes ccomplexos do protocolo de comunicação com o banco (TNS do oracle, por exemplo), mas contempla os problemas comuns a todos eles. </ul>
  8. 8. <ul>Exemplo (by nulaya) </ul><ul>var b1  varchar2(4000);   select /*+ CHOOSE */         null         into :b1     from       dual     where       1e1 = 1e1 connect by       rownum <= 1e3; </ul>
  9. 9. <ul>Exemplo complementado (by nulaya) </ul><ul>set echo off define off scan off feedback off heading off; set timing on termout on autotrace on;  set pagesize 0 linesize 1024 arraysize 1 ;   var b1  varchar2(4000);     select /*+ CHOOSE */         null         into :b1     from       dual     where       1e1 = 1e1 connect by       rownum <= 1e3; </ul>
  10. 10. <ul>Resultado </ul><ul>Decorrido: 00:00:04.12 Plano de Execução ---------------------------------------------------------- Plan hash value: 634278704 ------------------------------------------------------------------------------- | Id  | Operation                      | Name | Rows  | Cost (%CPU)| Time     | ------------------------------------------------------------------------------- |   0 | SELECT STATEMENT               |      |     1 |     2   (0)| 00:00:01 | |   1 |  COUNT                         |      |       |            |          | |*  2 |   FILTER                       |      |       |            |          | |*  3 |    CONNECT BY WITHOUT FILTERING|      |       |            |          | |   4 |     FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 | ------------------------------------------------------------------------------- </ul>
  11. 11. <ul>Resultado (cont.) </ul><ul>Predicate Information (identified by operation id): ---------------------------------------------------    2 - filter(1e1=1e1)    3 - filter(ROWNUM<=1e3) Estatística ----------------------------------------------------------           0  recursive calls           0  db block gets           0  consistent gets           0  physical reads           0  redo size       91309   bytes sent via SQL*Net to client       11334  bytes received via SQL*Net from client        1002  SQL*Net roundtrips to/from client           1  sorts (memory)           0  sorts (disk)        1000  rows processed </ul>
  12. 12. <ul>Exemplo complementado 2 (by nulaya) </ul><ul>set echo off define off scan off feedback off heading off; set timing on termout on autotrace on;  set pagesize 0 linesize 1024 arraysize 1000 ;   var b1  varchar2(4000);     select /*+ CHOOSE */         null         into :b1     from       dual     where       1e1 = 1e1 connect by       rownum <= 1e3; </ul>
  13. 13. <ul>Resultado 2 </ul><ul>Decorrido: 00:00:03.81 Plano de Execução ---------------------------------------------------------- Plan hash value: 634278704 ------------------------------------------------------------------------------- | Id  | Operation                      | Name | Rows  | Cost (%CPU)| Time     | ------------------------------------------------------------------------------- |   0 | SELECT STATEMENT               |      |     1 |     2   (0)| 00:00:01 | |   1 |  COUNT                         |      |       |            |          | |*  2 |   FILTER                       |      |       |            |          | |*  3 |    CONNECT BY WITHOUT FILTERING|      |       |            |          | |   4 |     FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 | ------------------------------------------------------------------------------- </ul>
  14. 14. <ul>Resultado 2 (cont.) </ul><ul>Predicate Information (identified by operation id): ---------------------------------------------------    2 - filter(1e1=1e1)    3 - filter(ROWNUM<=1e3) Estatística ----------------------------------------------------------           0  recursive calls           0  db block gets           0  consistent gets           0  physical reads           0  redo size        5393   bytes sent via SQL*Net to client         345  bytes received via SQL*Net from client           3  SQL*Net roundtrips to/from client           1  sorts (memory)           0  sorts (disk)        1000  rows processed </ul>
  15. 15. <ul>Roundtrip e Payload </ul><ul>(...) </ul><ul>91309   bytes sent via SQL*Net to client       11334  bytes received via SQL*Net from client        1002  SQL*Net roundtrips to/from client </ul><ul>(...) </ul><ul>(...) </ul><ul>5393   bytes sent via SQL*Net to client         345  bytes received via SQL*Net from client           3  SQL*Net roundtrips to/from client </ul><ul>(...) </ul><ul>The round-trip delay time (RTD) or round-trip time (RTT) is the length of time it takes for a signal to be sent plus the length of time it takes for an acknowledgment of that signal to be received. (wikipedia) </ul><ul>     Payload ou carga. Refere-se à quantidade de dados sendo trafegada.     Um payload baixo implica em mais pacotes para transportar uma mesma quantidade de dados, implicando em mais roundtrip.      É como transportar 100 litros de água em um balde de 10 litros, mas carregar apenas 1 litro por vez. </ul>
  16. 16. <ul>Use o &quot;fetch size&quot; adequado! </ul><ul>     Com JDBC é possível informar quantos resultados são esperados. Não informar quantos resultados são esperados faz o JDBC utilizar o padrão de 1 resultado.     Se vamos alimentar uma grid com tamaanho de exibição padrão de 10 linhas:          (...)     PreparedStatement pst = con.prepareStatement(sql);     pst.setParameter(1,vo.getNome());     pst.setFetchSize(10);// @since 1.2     ResultSet rs = pst.executeQuery();     (...) </ul>
  17. 17. <ul>JPA/Hibernate tem também, :) </ul><ul><property name=&quot;hibernate.jdbc.fetch_size&quot;>20</property>   ou <li> 
  18. 18. <property name=&quot;eclipselink.jdbc.fetch-size&quot; value=&quot;20&quot;/> </li></ul>
  19. 19. <ul>? </ul>
  20. 20. <ul>FIM </ul>

×