{"id":399,"date":"2016-04-03T22:04:11","date_gmt":"2016-04-04T01:04:11","guid":{"rendered":"http:\/\/dbtimewizard.com.br\/blog\/?p=399"},"modified":"2021-01-21T18:28:23","modified_gmt":"2021-01-21T21:28:23","slug":"como-pode-um-plano-de-execucao-mudar-quando-nao-ha-alteracoes-no-banco","status":"publish","type":"post","link":"http:\/\/dbtimewizard.com.br\/blog\/como-pode-um-plano-de-execucao-mudar-quando-nao-ha-alteracoes-no-banco\/","title":{"rendered":"Como pode um plano de execu\u00e7\u00e3o mudar quando n\u00e3o h\u00e1 altera\u00e7\u00f5es no banco?"},"content":{"rendered":"<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Como pode um plano de execu\u00e7\u00e3o mudar de repente, quando ningu\u00e9m fez qualquer altera\u00e7\u00e3o no banco de dados?<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Por nenhuma mudan\u00e7a, queremos dizer que n\u00e3o houve altera\u00e7\u00f5es na estrutura das tabelas, n\u00e3o foram adicionados ou alterados \u00edndices, nenhuma mudan\u00e7a relativa a &#8220;Bind Peeking&#8221;, sem mudan\u00e7as de par\u00e2metros do banco, n\u00e3o houve aplica\u00e7\u00e3o novos patches ou upgrades, n\u00e3o houve cria\u00e7\u00e3o de Outlines ou Profiles, n\u00e3o houve coleta de estat\u00edsticas do sistema e n\u00e3o houve quaisquer altera\u00e7\u00f5es nas estat\u00edsticas CBO.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">O DBA n\u00e3o fez qualquer altera\u00e7\u00e3o e de repente, sem raz\u00e3o aparente, o plano de execu\u00e7\u00e3o foi\u00a0modificado e (por exemplo) um \u00edndice inadequado passa a ser usado e causa degrada\u00e7\u00e3o no desempenho da instru\u00e7\u00e3o SQL.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Como isso pode ser poss\u00edvel?<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Conceitos distorcidos<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Exitem dois pontos que precisamos esclarecer para conseguir compreender a resposta para a quest\u00e3o acima proposta:<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">1. h\u00e1 um equ\u00edvoco comum que se n\u00e3o houver coleta de estat\u00edsticas (e assumindo que nada mais \u00e9 alterado no banco de dados), o plano de execu\u00e7\u00e3o vai permanecer sempre o mesmo e pode-se garantir que o banco de dados manter\u00e1 a mesma performance.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Esta afirma\u00e7\u00e3o n\u00e3o \u00e9 verdadeira. Na verdade, \u00e9 exatamente o oposto. \u00c9 necess\u00e1rio coletar novas estat\u00edsticas para garantir que os planos de execu\u00e7\u00e3o n\u00e3o mudem. S\u00e3o as estat\u00edsticas desatualizadas que podem causar mudan\u00e7a nos planos de execu\u00e7\u00e3o.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">2. Quando algu\u00e9m analisa todas as coisas que poderiam ter mudado no banco de dados, dois aspectos importantes normalmente s\u00e3o ignorados:<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">O primeiro aspecto \u00e9 que os dados das aplica\u00e7\u00f5es normalmente est\u00e3o em constante mudan\u00e7a na maioria das bases de dados. A mudan\u00e7a nos dados das aplica\u00e7\u00f5es podem influenciar diretamente o comportamento do Otimizador.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">O segundo aspecto que esta em constante modifica\u00e7\u00e3o \u00e9 o tempo. Quando a performance das transa\u00e7\u00f5es do banco estavam funcionando bem, o banco estava em um ponto diferente no tempo do que esta agora quando as transa\u00e7\u00f5es est\u00e3o apresentando problema de performance.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Portanto, nem todas as mudan\u00e7as que ocorrem no banco est\u00e3o sob o controle do DBA.<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Demonstra\u00e7\u00e3o pr\u00e1tica<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">A seguir vamos ver um exemplo pr\u00e1tico de como um plano de execu\u00e7\u00e3o pode ser modificado pelo Otimizador numa base em que o DBA n\u00e3o far\u00e1 qualquer\u00a0altera\u00e7\u00e3o, haver\u00e1 mudan\u00e7a somente nos dois aspectos que est\u00e3o fora do controle do DBA, os dados da aplica\u00e7\u00e3o e o passar do tempo.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para execu\u00e7\u00e3o da consulta\u00a0vamos criar um tabela e incluir nela uns 5\u00a0anos de registros, criar um \u00edndice e coletar as estat\u00edsticas.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span> FROM V<span class=\"re0\">$VERSION<\/span> where rownum <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nBANNER<br \/>\n<span class=\"sy0\">--------------------------------------------------------------------------------<\/span><br \/>\nOracle Database 11g Enterprise Edition Release 11<span class=\"sy0\">.<\/span>2<span class=\"sy0\">.<\/span>0<span class=\"sy0\">.<\/span>4<span class=\"sy0\">.<\/span>0 <span class=\"sy0\">-<\/span> 64bit Production<br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> row selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create table dbtw01 <span class=\"br0\">&#40;<\/span>id number<span class=\"sy0\">,<\/span> reg_date <a href=\"http:\/\/www.php.net\/date\"><span class=\"kw3\">date<\/span><\/a><span class=\"sy0\">,<\/span> name varchar2<span class=\"br0\">&#40;<\/span><span class=\"nu0\">20<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nTable created<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <span class=\"kw2\">declare<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp;v_count &nbsp;number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp;begin<br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp;v_count<span class=\"sy0\">:=<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">5<\/span> &nbsp;<span class=\"kw1\">for<\/span> i in <span class=\"nu0\">1<\/span><span class=\"sy0\">..<\/span><span class=\"nu0\">1830<\/span> loop<br \/>\n&nbsp; <span class=\"nu0\">6<\/span> &nbsp; &nbsp; <span class=\"kw1\">for<\/span> j in <span class=\"nu0\">1<\/span><span class=\"sy0\">..<\/span><span class=\"nu0\">1000<\/span> loop<br \/>\n&nbsp; <span class=\"nu0\">7<\/span> &nbsp; &nbsp; v_count<span class=\"sy0\">:=<\/span> v_count<span class=\"sy0\">+<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">8<\/span> &nbsp; &nbsp; insert into dbtw01 values <span class=\"br0\">&#40;<\/span>v_count<span class=\"sy0\">,<\/span> sysdate<span class=\"sy0\">-<\/span>i<span class=\"sy0\">,<\/span> <span class=\"st_h\">'DBTimeWizard'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">9<\/span> &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a> loop<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">10<\/span> &nbsp;<a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a> loop<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">11<\/span> &nbsp;commit<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">12<\/span> &nbsp;<a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">13<\/span> &nbsp;<span class=\"sy0\">\/<\/span><br \/>\n<br \/>\nPL<span class=\"sy0\">\/<\/span>SQL procedure successfully completed<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> create index dbtw01_idx on dbtw01<span class=\"br0\">&#40;<\/span>reg_date<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nIndex created<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> <a href=\"http:\/\/www.php.net\/exec\"><span class=\"kw3\">exec<\/span><\/a> dbms_stats<span class=\"sy0\">.<\/span>gather_table_stats<span class=\"br0\">&#40;<\/span>ownname<span class=\"sy0\">=&gt;<\/span>USER<span class=\"sy0\">,<\/span> tabname<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'DBTW01'<\/span><span class=\"sy0\">,<\/span> cascade<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> estimate_percent<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">null<\/span><span class=\"sy0\">,<\/span> method_opt<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'FOR ALL COLUMNS SIZE 254'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nPL<span class=\"sy0\">\/<\/span>SQL procedure successfully completed<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Consulta normal com as estat\u00edsticas atualizadas<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Vamos executar uma consulta t\u00edpica de uma aplica\u00e7\u00e3o onde estamos interessados nos valores de dados dos \u00faltimos doze meses. Esta consulta \u00e9 executada diariamente e trabalha com uma &#8220;janela m\u00f3vel&#8221; de dados e os registros relevantes s\u00e3o aqueles que foram gerados nos \u00faltimos 365 dias.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> ALTER SESSION SET statistics_level<span class=\"sy0\">=<\/span>ALL<span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSession altered<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> select <span class=\"coMULTI\">\/* tst101 *\/<\/span> <span class=\"sy0\">*<\/span> <br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;from dbtw01<br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; where reg_date <span class=\"sy0\">&gt;<\/span> sysdate <span class=\"sy0\">-<\/span> <span class=\"nu0\">365<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ID REG_DATE &nbsp;NAME<br \/>\n<span class=\"sy0\">----------<\/span> <span class=\"sy0\">---------<\/span> <span class=\"sy0\">------------------------------<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">......<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358582<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358583<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358584<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358585<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358586<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp; <span class=\"nu0\">358587<\/span> <span class=\"nu19\">08<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">15<\/span> DBTimeWizard<br \/>\n<br \/>\n<span class=\"nu0\">364000<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column sql_id new_value m_sql_id<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column child_number new_value m_child_no<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT sql_id<span class=\"sy0\">,<\/span> child_number<br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM v<span class=\"re0\">$sql<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE sql_text LIKE <span class=\"st_h\">'%tst101%'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; AND sql_text NOT LIKE <span class=\"st_h\">'%v$sql%'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSQL_ID &nbsp; &nbsp; &nbsp; &nbsp;CHILD_NUMBER<br \/>\n<span class=\"sy0\">-------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\nga3uqz5gpxufn &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">0<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> row selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nPLAN_TABLE_OUTPUT<br \/>\n<span class=\"sy0\">---------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\nSQL_ID &nbsp;ga3uqz5gpxufn<span class=\"sy0\">,<\/span> child number <span class=\"nu0\">0<\/span><br \/>\n<span class=\"sy0\">-------------------------------------<\/span><br \/>\nselect <span class=\"coMULTI\">\/* tst101 *\/<\/span> <span class=\"sy0\">*<\/span> &nbsp; from dbtw01 &nbsp;where reg_date <span class=\"sy0\">&gt;<\/span> sysdate <span class=\"sy0\">-<\/span><br \/>\n<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_0&quot;<\/span><br \/>\n<br \/>\nPlan <a href=\"http:\/\/www.php.net\/hash\"><span class=\"kw3\">hash<\/span><\/a> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">658621498<\/span><br \/>\n<br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> Id &nbsp;<span class=\"sy0\">|<\/span> Operation &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> Name &nbsp; <span class=\"sy0\">|<\/span> Starts <span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span>E<span class=\"sy0\">-<\/span>Bytes<span class=\"sy0\">|<\/span> Cost <span class=\"br0\">&#40;<\/span><span class=\"sy0\">%<\/span>CPU<span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> A<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span> &nbsp; A<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> Buffers <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">0<\/span> <span class=\"sy0\">|<\/span> SELECT STATEMENT &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2196<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp;364K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.29<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">32199<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|*<\/span> &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp;TABLE ACCESS FULL<span class=\"sy0\">|<\/span> DBTW01 <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;364K<span class=\"sy0\">|<\/span> &nbsp;9251K<span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2196<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">27<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;364K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.29<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">32199<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">----------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<br \/>\nPredicate Information <span class=\"br0\">&#40;<\/span>identified by operation id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">-<\/span> filter<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;REG_DATE&quot;<\/span><span class=\"sy0\">&gt;<\/span>SYSDATE<span class=\"sy0\">@!-:<\/span>SYS_B_0<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"nu0\">19<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Podemos observar na log acima que o Otimizador (CBO) escolheu uma plano de execu\u00e7\u00e3o que faz uma opera\u00e7\u00e3o de &#8220;Full Table Scan&#8221; (FTS), pois a quantidade de registros a ser acessada corresponde a um percentual alto da tabela e o acesso desses registros consultando tamb\u00e9m um \u00edndice seria ineficiente. Observe tamb\u00e9m como o Otimizador foi preciso\u00a0com rela\u00e7\u00e3o a cardinalidade e previu corretamente o n\u00famero de registros a ser retornado. Quando o Otimizador consegue estimar a cardinalidade com alta precis\u00e3o a efici\u00eancia do plano de execu\u00e7\u00e3o que ele gera \u00e9 muito boa. Nesse caso como os usu\u00e1rios est\u00e3o satisfeitos com o tempo de resposta da consulta vamos imaginar que o DBA decide n\u00e3o coletar mais estat\u00edsticas dessa tabela para evitar que o Otimizador mude o plano de execu\u00e7\u00e3o numa execu\u00e7\u00e3o futura.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Entretanto todos os dias temos milhares de registros sendo inseridos nesta tabela, e para simular esta situa\u00e7\u00e3o vamos executar uma &#8220;procedure&#8221; que vai simular a inser\u00e7\u00e3o de registros nos pr\u00f3ximos 365 dias.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> <span class=\"kw2\">declare<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp; v_count &nbsp;number<span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp;begin<br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; v_count<span class=\"sy0\">:=<\/span><span class=\"nu0\">1830000<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">5<\/span> &nbsp; &nbsp; <span class=\"kw1\">for<\/span> i in <span class=\"nu0\">1<\/span><span class=\"sy0\">..<\/span><span class=\"nu0\">365<\/span> loop<br \/>\n&nbsp; <span class=\"nu0\">6<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"kw1\">for<\/span> j in <span class=\"nu0\">1<\/span><span class=\"sy0\">..<\/span><span class=\"nu0\">1000<\/span> loop<br \/>\n&nbsp; <span class=\"nu0\">7<\/span> &nbsp; &nbsp; &nbsp; &nbsp;v_count<span class=\"sy0\">:=<\/span> v_count<span class=\"sy0\">+<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">8<\/span> &nbsp; &nbsp; &nbsp; &nbsp;insert into dbtw01 values <span class=\"br0\">&#40;<\/span>v_count<span class=\"sy0\">,<\/span> sysdate<span class=\"sy0\">+<\/span>i<span class=\"sy0\">,<\/span> <span class=\"st_h\">'DBTimeWizard'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; <span class=\"nu0\">9<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a> loop<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">10<\/span> &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a> loop<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">11<\/span> &nbsp;commit<span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">12<\/span> &nbsp;<a href=\"http:\/\/www.php.net\/end\"><span class=\"kw3\">end<\/span><\/a><span class=\"sy0\">;<\/span><br \/>\n&nbsp;<span class=\"nu0\">13<\/span> &nbsp;<span class=\"sy0\">\/<\/span><br \/>\n<br \/>\nPL<span class=\"sy0\">\/<\/span>SQL procedure successfully completed<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<h2 style=\"text-align: justify;\"><\/h2>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Consulta ap\u00f3s um ano sem atualiza\u00e7\u00e3o das estat\u00edsticas<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Como na execu\u00e7\u00e3o da &#8220;procedure&#8221; simulamos que 365 dias se passaram, vamos agora executar aquela consulta que tem periodicidade di\u00e1ria e simular esse avan\u00e7o no tempo, para isso vamos\u00a0somar a data atual (sysdate) mais 365 dias, ou seja nossa consulta vai viajar no tempo para o futuro. Um detalhe muito importante como foi\u00a0dito anteriormente o DBA decidiu suspender a coleta de estat\u00edsticas para evitar que o plano fosse alterado pelo Otimizador, portanto n\u00e3o vamos coletar as estat\u00edsticas da tabela.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> select <span class=\"coMULTI\">\/* tst102 *\/<\/span> <span class=\"sy0\">*<\/span> <br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;from dbtw01<br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; where reg_date <span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>sysdate <span class=\"sy0\">+<\/span> <span class=\"nu0\">365<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"nu0\">365<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ID REG_DATE &nbsp;NAME<br \/>\n<span class=\"sy0\">----------<\/span> <span class=\"sy0\">---------<\/span> <span class=\"sy0\">------------------------------<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">......<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2194905<\/span> <span class=\"nu8\">01<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2194906<\/span> <span class=\"nu8\">01<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2194907<\/span> <span class=\"nu8\">01<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2194908<\/span> <span class=\"nu8\">01<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2194909<\/span> <span class=\"nu8\">01<\/span><span class=\"sy0\">-<\/span>APR<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n<br \/>\n<span class=\"nu0\">365000<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column sql_id new_value m_sql_id<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column child_number new_value m_child_no<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT sql_id<span class=\"sy0\">,<\/span> child_number<br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM v<span class=\"re0\">$sql<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE sql_text LIKE <span class=\"st_h\">'%tst102%'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; AND sql_text NOT LIKE <span class=\"st_h\">'%v$sql%'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSQL_ID &nbsp; &nbsp; &nbsp; &nbsp;CHILD_NUMBER<br \/>\n<span class=\"sy0\">-------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\n51g8b9my5ya4s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">0<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> row selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nPLAN_TABLE_OUTPUT<br \/>\n<span class=\"sy0\">--------------------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\nSQL_ID &nbsp;51g8b9my5ya4s<span class=\"sy0\">,<\/span> child number <span class=\"nu0\">0<\/span><br \/>\n<span class=\"sy0\">-------------------------------------<\/span><br \/>\nselect <span class=\"coMULTI\">\/* tst102 *\/<\/span> <span class=\"sy0\">*<\/span> &nbsp; from dbtw01 &nbsp;where reg_date <span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>sysdate <span class=\"sy0\">+<\/span><br \/>\n<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_0&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_1&quot;<\/span><br \/>\n<br \/>\nPlan <a href=\"http:\/\/www.php.net\/hash\"><span class=\"kw3\">hash<\/span><\/a> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">954539352<\/span><br \/>\n<br \/>\n<span class=\"sy0\">------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> Id &nbsp;<span class=\"sy0\">|<\/span> Operation &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> Name &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> Starts <span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span>E<span class=\"sy0\">-<\/span>Bytes<span class=\"sy0\">|<\/span> Cost <span class=\"br0\">&#40;<\/span><span class=\"sy0\">%<\/span>CPU<span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> A<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span> &nbsp; A<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> Buffers <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">0<\/span> <span class=\"sy0\">|<\/span> SELECT STATEMENT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">11<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.40<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">51611<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp;TABLE ACCESS BY INDEX ROWID<span class=\"sy0\">|<\/span> DBTW01 &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">961<\/span> <span class=\"sy0\">|<\/span> <span class=\"nu0\">24986<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">11<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.40<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">51611<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|*<\/span> &nbsp;<span class=\"nu0\">2<\/span> <span class=\"sy0\">|<\/span> &nbsp; INDEX <a href=\"http:\/\/www.php.net\/range\"><span class=\"kw3\">RANGE<\/span><\/a> SCAN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> DBTW01_IDX <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;<span class=\"nu0\">961<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp; &nbsp; <span class=\"nu0\">5<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">01<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">00.22<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">25577<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<br \/>\nPredicate Information <span class=\"br0\">&#40;<\/span>identified by operation id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2<\/span> <span class=\"sy0\">-<\/span> access<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;REG_DATE&quot;<\/span><span class=\"sy0\">&gt;<\/span>SYSDATE<span class=\"sy0\">@!+:<\/span>SYS_B_0<span class=\"sy0\">-:<\/span>SYS_B_1<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"nu0\">20<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Verificando o resultado da nossa consulta acima, podemos observar que o plano de execu\u00e7\u00e3o mudou. O acesso a tabela agora utiliza o \u00edndice DBTW01_IDX, observe tamb\u00e9m que a estimativa de linhas a ser acessada esta muito ruim\u00a0(963 linhas), quando na realidade a consulta acessou 365 mil linhas.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">A consulta \u00e9 a mesma, o DBA n\u00e3o fez altera\u00e7\u00f5es no banco, no entanto o plano de execu\u00e7\u00e3o mudou e o desempenho da consulta ficou pior pois na primeira execu\u00e7\u00e3o o banco acessou 32199 Buffers e nesta ultima 51611 Buffers.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Por que o plano de execu\u00e7\u00e3o mudou quando n\u00e3o houve altera\u00e7\u00f5es na estat\u00edsticas?<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para o Otimizador o registro mais atual na tabela \u00e9 de 1 ano atr\u00e1s em rela\u00e7\u00e3o a data da execu\u00e7\u00e3o da consulta (sysdate+365), pois essa \u00e9 a informa\u00e7\u00e3o que ele consegue obter consultando as estat\u00edsticas, portanto para calcular a estimativa de linhas que vai ser recuperada da tabela dos \u00faltimos 365 dias, ele considera que s\u00f3 existem registros de 1 dia.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Como vamos corrigir esse plano de execu\u00e7\u00e3o ineficiente?<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Consulta ap\u00f3s um ano com atualiza\u00e7\u00e3o das estat\u00edsticas<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para que o Otimizador volte a escolher o melhor plano de execu\u00e7\u00e3o, precisamos deixar que ele obtenha informa\u00e7\u00f5es mais precisas sobre os dados existentes na tabela e isso s\u00f3 \u00e9 poss\u00edvel se atualizarmos as estat\u00edsticas.<\/span><\/p>\n<p>&nbsp;<\/p>\n<div class=\"codecolorer-container php default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;width:800px;height:520px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/><\/div><\/td><td><div class=\"php codecolorer\">SQL <span class=\"sy0\">&gt;<\/span> <a href=\"http:\/\/www.php.net\/exec\"><span class=\"kw3\">exec<\/span><\/a> dbms_stats<span class=\"sy0\">.<\/span>gather_table_stats<span class=\"br0\">&#40;<\/span>ownname<span class=\"sy0\">=&gt;<\/span>USER<span class=\"sy0\">,<\/span> tabname<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'DBTW01'<\/span><span class=\"sy0\">,<\/span> cascade<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">true<\/span><span class=\"sy0\">,<\/span> estimate_percent<span class=\"sy0\">=&gt;<\/span><span class=\"kw4\">null<\/span><span class=\"sy0\">,<\/span> method_opt<span class=\"sy0\">=&gt;<\/span><span class=\"st_h\">'FOR ALL COLUMNS SIZE 254'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nPL<span class=\"sy0\">\/<\/span>SQL procedure successfully completed<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> select <span class=\"coMULTI\">\/* tst103 *\/<\/span> <span class=\"sy0\">*<\/span> <br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;from dbtw01<br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; where reg_date <span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>sysdate <span class=\"sy0\">+<\/span> <span class=\"nu0\">365<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"nu0\">365<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ID REG_DATE &nbsp;NAME<br \/>\n<span class=\"sy0\">----------<\/span> <span class=\"sy0\">---------<\/span> <span class=\"sy0\">------------------------------<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sy0\">......<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2125897<\/span> <span class=\"nu0\">22<\/span><span class=\"sy0\">-<\/span>JAN<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2125898<\/span> <span class=\"nu0\">22<\/span><span class=\"sy0\">-<\/span>JAN<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2125899<\/span> <span class=\"nu0\">22<\/span><span class=\"sy0\">-<\/span>JAN<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2125900<\/span> <span class=\"nu0\">22<\/span><span class=\"sy0\">-<\/span>JAN<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">2125901<\/span> <span class=\"nu0\">22<\/span><span class=\"sy0\">-<\/span>JAN<span class=\"sy0\">-<\/span><span class=\"nu0\">17<\/span> DBTimeWizard<br \/>\n<br \/>\n<span class=\"nu0\">365000<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column sql_id new_value m_sql_id<br \/>\nSQL <span class=\"sy0\">&gt;<\/span> column child_number new_value m_child_no<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT sql_id<span class=\"sy0\">,<\/span> child_number<br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM v<span class=\"re0\">$sql<\/span><br \/>\n&nbsp; <span class=\"nu0\">3<\/span> &nbsp; WHERE sql_text LIKE <span class=\"st_h\">'%tst103%'<\/span><br \/>\n&nbsp; <span class=\"nu0\">4<\/span> &nbsp; &nbsp; AND sql_text NOT LIKE <span class=\"st_h\">'%v$sql%'<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nSQL_ID &nbsp; &nbsp; &nbsp; &nbsp;CHILD_NUMBER<br \/>\n<span class=\"sy0\">-------------<\/span> <span class=\"sy0\">------------<\/span><br \/>\n18mprzh16nz46 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">0<\/span><br \/>\n<br \/>\n<span class=\"nu0\">1<\/span> row selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span><br \/>\nSQL <span class=\"sy0\">&gt;<\/span> SELECT <span class=\"sy0\">*<\/span><br \/>\n&nbsp; <span class=\"nu0\">2<\/span> &nbsp; &nbsp;FROM TABLE <span class=\"br0\">&#40;<\/span>dbms_xplan<span class=\"sy0\">.<\/span>display_cursor <span class=\"br0\">&#40;<\/span><span class=\"st_h\">'&amp;m_sql_id'<\/span><span class=\"sy0\">,&amp;<\/span>m_child_no<span class=\"sy0\">,<\/span><span class=\"st_h\">'typical iostats last'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nPLAN_TABLE_OUTPUT<br \/>\n<span class=\"sy0\">-------------------------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\nSQL_ID &nbsp;18mprzh16nz46<span class=\"sy0\">,<\/span> child number <span class=\"nu0\">0<\/span><br \/>\n<span class=\"sy0\">-------------------------------------<\/span><br \/>\nselect <span class=\"coMULTI\">\/* tst103 *\/<\/span> <span class=\"sy0\">*<\/span> &nbsp; from dbtw01 &nbsp;where reg_date <span class=\"sy0\">&gt;<\/span> <span class=\"br0\">&#40;<\/span>sysdate <span class=\"sy0\">+<\/span><br \/>\n<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_0&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"sy0\">:<\/span><span class=\"st0\">&quot;SYS_B_1&quot;<\/span><br \/>\n<br \/>\nPlan <a href=\"http:\/\/www.php.net\/hash\"><span class=\"kw3\">hash<\/span><\/a> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">658621498<\/span><br \/>\n<br \/>\n<span class=\"sy0\">-------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> Id &nbsp;<span class=\"sy0\">|<\/span> Operation &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> Name &nbsp; <span class=\"sy0\">|<\/span> Starts <span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span>E<span class=\"sy0\">-<\/span>Bytes<span class=\"sy0\">|<\/span> Cost <span class=\"br0\">&#40;<\/span><span class=\"sy0\">%<\/span>CPU<span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> E<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> A<span class=\"sy0\">-<\/span>Rows <span class=\"sy0\">|<\/span> &nbsp; A<span class=\"sy0\">-<\/span><a href=\"http:\/\/www.php.net\/time\"><span class=\"kw3\">Time<\/span><\/a> &nbsp; <span class=\"sy0\">|<\/span> Buffers <span class=\"sy0\">|<\/span> Reads &nbsp;<span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">-------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">0<\/span> <span class=\"sy0\">|<\/span> SELECT STATEMENT &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; <span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2820<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">02.72<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">33825<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">9589<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">|*<\/span> &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp;TABLE ACCESS FULL<span class=\"sy0\">|<\/span> DBTW01 <span class=\"sy0\">|<\/span> &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span> &nbsp;9637K<span class=\"sy0\">|<\/span> &nbsp;<span class=\"nu0\">2820<\/span> &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">|<\/span> <span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">34<\/span> <span class=\"sy0\">|<\/span> &nbsp; &nbsp;365K<span class=\"sy0\">|<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu8\">00<\/span><span class=\"sy0\">:<\/span><span class=\"nu19\">02.72<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">33825<\/span> <span class=\"sy0\">|<\/span> &nbsp; <span class=\"nu0\">9589<\/span> <span class=\"sy0\">|<\/span><br \/>\n<span class=\"sy0\">-------------------------------------------------------------------------------------------------------------------------------<\/span><br \/>\n<br \/>\nPredicate Information <span class=\"br0\">&#40;<\/span>identified by operation id<span class=\"br0\">&#41;<\/span><span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">---------------------------------------------------<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"nu0\">1<\/span> <span class=\"sy0\">-<\/span> filter<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;REG_DATE&quot;<\/span><span class=\"sy0\">&gt;<\/span>SYSDATE<span class=\"sy0\">@!+:<\/span>SYS_B_0<span class=\"sy0\">-:<\/span>SYS_B_1<span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n<br \/>\n<span class=\"nu0\">19<\/span> rows selected<span class=\"sy0\">.<\/span><br \/>\n<br \/>\nSQL <span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Quando atualizamos as estat\u00edsticas e executamos novamente a consulta que avan\u00e7a no tempo 1 ano, podemos verificar que a estimativa de cardinalidade volta a ser precisa (E-Rows = A-Rows) e o plano de execu\u00e7\u00e3o volta a ser o mesmo da primeira execu\u00e7\u00e3o com acesso a tabela atrav\u00e9s de uma opera\u00e7\u00e3o de FULL TABLE SCAN.<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Conclus\u00e3o<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Portanto respondendo a quest\u00e3o apresentada no inicio desse artigo: sim, um plano de execu\u00e7\u00e3o pode mudar, mesmo que n\u00e3o ocorram quaisquer altera\u00e7\u00f5es no banco de dados, incluindo a coleta de estat\u00edsticas de dados. Se voc\u00ea acha que n\u00e3o coletando estat\u00edsticas de dados, as coisas v\u00e3o simplesmente permanecer inalteradas, um dia, quando voc\u00ea menos espera, voc\u00ea vai se deparar com planos de execu\u00e7\u00e3o diferentes e com desempenho indesejado.<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Refer\u00eancias<\/span><\/h2>\n<p><strong><a href=\"https:\/\/richardfoote.wordpress.com\/2010\/02\/16\/how-does-an-execution-plan-suddenly-change-when-the-statistics-remain-the-same-in-limbo\/\" target=\"_blank\">https:\/\/richardfoote.wordpress.com\/2010\/02\/16\/how-does-an-execution-plan-suddenly-change-when-the-statistics-remain-the-same-in-limbo\/<\/a><\/strong><\/p>\n<p>&nbsp;<br \/>\n&nbsp;<br \/>\n<a href=\"http:\/\/dbtimewizard.com.br\/treinamento\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1255\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2018\/10\/promo_cur02.jpg\" alt=\"Promo-D75L\" width=\"330\" height=\"242\" \/><\/a><\/p>\n<p><a href=\"https:\/\/youtu.be\/l6OphhTle9I\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1215\" src=\"http:\/\/dbtimewizard.com.br\/wp-content\/uploads\/2018\/01\/video-02-300x168.jpg\" alt=\"video-02\" width=\"330\" height=\"242\" \/><\/a><br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como pode um plano de execu\u00e7\u00e3o mudar de repente, quando ningu\u00e9m fez qualquer altera\u00e7\u00e3o no banco de dados? Por nenhuma mudan\u00e7a, queremos dizer que n\u00e3o houve altera\u00e7\u00f5es na estrutura das tabelas, n\u00e3o foram adicionados ou alterados \u00edndices, nenhuma mudan\u00e7a relativa a &#8220;Bind Peeking&#8221;, sem mudan\u00e7as de par\u00e2metros do banco, n\u00e3o houve aplica\u00e7\u00e3o novos patches ou upgrades, n\u00e3o houve cria\u00e7\u00e3o de<\/p>\n","protected":false},"author":2,"featured_media":400,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[6,42,39,82,10,119],"class_list":["post-399","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-estatisticas","tag-cbo","tag-cost-base-optimizer","tag-estatisticas","tag-optimizer","tag-otimizador","tag-statistics"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/comments?post=399"}],"version-history":[{"count":15,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/399\/revisions"}],"predecessor-version":[{"id":2264,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/399\/revisions\/2264"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media\/400"}],"wp:attachment":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media?parent=399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/categories?post=399"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/tags?post=399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}