{"id":184,"date":"2008-02-21T10:16:00","date_gmt":"2008-02-21T13:16:00","guid":{"rendered":"http:\/\/www.soudba.com.br\/?p=184"},"modified":"2008-02-21T10:16:00","modified_gmt":"2008-02-21T13:16:00","slug":"fazendo-o-plano-de-execucao-da-consulta","status":"publish","type":"post","link":"https:\/\/www.soudba.com.br\/?p=184","title":{"rendered":"Fazendo o plano de execucao da consulta"},"content":{"rendered":"<p>Ola,<\/p>\n<p>O plano da execucao das consultas podera sera executado atraves de ferramentas de terceiros ou atraves do proprio oracle. Primeiramente precisamos ter a tabela que contera os planos gerados pelo oracle ou pelas ferramentas. Para isso vamos executar o script $ORACLE_HOME\/rdbms\/admin\/utlxplan.sql: <\/p>\n<p>cd $ORACLE_HOME\/rdbms\/admin<br \/>sqlplus &#8220;\/ as sysdba&#8221;<\/p>\n<p>SQL&gt; create user query identified by query;<\/p>\n<p>Usu\u00dfrio criado.<\/p>\n<p>SQL&gt; grant resource,connect to query;<\/p>\n<p>Concess\u00d2o bem-sucedida.<\/p>\n<p>SQL&gt; grant dba to query;<\/p>\n<p>Concess\u00d2o bem-sucedida.<\/p>\n<p>SQL&gt; create table TBLDADOS as select * from dba_tables;<\/p>\n<p>Tabela criada.<\/p>\n<p>SQL&gt; create table TBLJOIN as select * from dba_tables;<\/p>\n<p>Tabela criada.<\/p>\n<p>SQL&gt;<\/p>\n<p>SQL&gt;@utlxplan.sql;<\/p>\n<p>Agora execute o comando:<\/p>\n<p>SQL&gt; set autotrace on<\/p>\n<p>SQL&gt; explain plan for select * from TBLDADOS, TBLJOIN<br \/>     where TBLDADOS.TABLE_NAME = TBLJOIN.TABLE_NAME<br \/>     ORDER BY 1,2,3;<\/p>\n<p>Ap\u00f3s a query ser executada, aparecer\u00e1 no final do SQL*Plus o plano de execu\u00e7\u00e3o pronto, sem que seja necess\u00e1rio mais nenhum passo.<\/p>\n<p>Para remover \u00e9 so editar o seguinte comando:<\/p>\n<p>SQL&gt; set autotrace off<\/p>\n<p>Ou ver o resultado que foi inserido na table PLAN_TABLE com a consulta:<\/p>\n<p>SQL&gt; <br \/>select <br \/>  substr (lpad(&#8216; &#8216;, level-1) || operation || &#8216; (&#8216; || <br \/>   options || &#8216;)&#8217;,1,30 ) &#8220;Operation&#8221;, <br \/>   object_name                                                              <br \/>   &#8220;Object&#8221;<br \/>from plan_table <br \/>  start with id = 0 <br \/>  connect by prior id=parent_id;<\/p>\n<p>ou como na saida dos melhores programas de terceiros:<\/p>\n<p>SQL&gt; select * from table (dbms_xplan.display);<\/p>\n<p>O custo de CPU somente aparece quando as estat\u00edsticas de sistema est\u00e3o habilitadas. \u201cDynamic sampling used for this statement\u201d significa que esta tabela n\u00e3o esta com estat\u00edsticas. O banco tamb\u00e9m esta configurado para gerar um sample das estat\u00edsticas se n\u00e3o existir na tabela. Para ativa-lo coloque na inicializacao este parametro para TRUE mas tome cuidado pode reduzir o performance se for em um ambiente em producao, portanto use e depois volte para false.<\/p>\n<p>TIMED_STATISTICS = TRUE &#8212; Parametro de inicializacao do banco<\/p>\n<p>Ou na sessao:<\/p>\n<p>alter session <br \/>set timed_statistics=true<br \/>alter session <br \/>set max_dump_file_size=unlimited<br \/>*** DUMP FILE SIZE IS LIMITED TO 1048576 BYTES ***<\/p>\n<p>Resolva o problema criando um indice para as clausulas envolvidas na jun\u00e7\u00e3o.<\/p>\n<p>SQL&gt; create index TBLJOINIDX1 on TBLJOIN(TABLE_NAME);<\/p>\n<p>SQL&gt; create index TBLDADOSIDX1 on TBLDADOS(TABLE_NAME);<\/p>\n<p>Refa\u00e7a o plano para verificar as devidas <\/p>\n<p>SQL&gt; explain plan for select * from TBLDADOS, TBLJOIN<br \/>     where TBLDADOS.TABLE_NAME = TBLJOIN.TABLE_NAME<br \/>     ORDER BY 1,2,3;<\/p>\n<p>Ap\u00f3s a query ser executada, aparecer\u00e1 no final do SQL*Plus o plano de execu\u00e7\u00e3o pronto, sem que seja necess\u00e1rio mais nenhum passo.<\/p>\n<p>Para remover \u00e9 so editar o seguinte comando:<\/p>\n<p>SQL&gt; set autotrace off<\/p>\n<p>Ou ver o resultado que foi inserido na table PLAN_TABLE com a consulta:<\/p>\n<p>SQL&gt; <br \/>select <br \/>  substr (lpad(&#8216; &#8216;, level-1) || operation || &#8216; (&#8216; || <br \/>   options || &#8216;)&#8217;,1,30 ) &#8220;Operation&#8221;, <br \/>   object_name                                                              <br \/>   &#8220;Object&#8221;<br \/>from plan_table <br \/>  start with id = 0 <br \/>  connect by prior id=parent_id;<\/p>\n<p>Voce deve apagar o conteudo da tabela PLAN_TABLE depois de analisar o resultado, caso utilize a sintaxe sql para consulta-la ao inves da dbms_xplan.<\/p>\n<p>SQL&gt; DELETE FROM  plan_table;<\/p>\n<p>Se tiver usando um programa para visualizar a saida o melhor \u00e9 colocar em uma fonte fixa, como fixedsys ou Misc Fixed.<\/p>\n<p>Create table do PLAN_TABLE que vem com o 9i R2:<\/p>\n<p>create table PLAN_TABLE (<br \/>        statement_id    varchar2(30),<br \/>        timestamp       date,<br \/>        remarks         varchar2(80),<br \/>        operation       varchar2(30),<br \/>        options         varchar2(255),<br \/>        object_node     varchar2(128),<br \/>        object_owner    varchar2(30),<br \/>        object_name     varchar2(30),<br \/>        object_instance numeric,<br \/>        object_type     varchar2(30),<br \/>        optimizer       varchar2(255),<br \/>        search_columns  number,<br \/>        id              numeric,<br \/>        parent_id       numeric,<br \/>        position        numeric,<br \/>        cost            numeric,<br \/>        cardinality     numeric,<br \/>        bytes           numeric,<br \/>        other_tag       varchar2(255),<br \/>        partition_start varchar2(255),<br \/>        partition_stop  varchar2(255),<br \/>        partition_id    numeric,<br \/>        other           long,<br \/>        distribution    varchar2(30),<br \/>        cpu_cost        numeric,<br \/>        io_cost         numeric,<br \/>        temp_space      numeric,<br \/>        access_predicates varchar2(4000),<br \/>        filter_predicates varchar2(4000));<\/p>\n<p>Para o 10G release 2 ficou mais facil:<\/p>\n<p>A new feature of Oracle 10g Release 2 is that<\/p>\n<p>set autotrace traceonly explainis using DBMS_XPLAN now.<\/p>\n<p>Quote from http:\/\/www.oracle.com\/technology\/oramag\/oracle\/05-sep\/o55asktom.html<\/p>\n<p>SQL&gt; set autotrace traceonly explain<\/p>\n<p>SQL&gt; select *<br \/>2  from emp, dept<br \/>3  where emp.deptno = dept.deptno<br \/>4  and emp.job = &#8216;CLERK&#8217;;<\/p>\n<p>Execution Plan<br \/>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<\/p>\n<p>Plan hash value: 877088642<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<br \/>| Id |   Operation              | Name  | Rows  | Bytes         | Cost (%CPU)           | Time     |<br \/>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<br \/>|  0 |  SELECT STATEMENT        |       |     4 |   468         |     7     (15)        | 00:00:01 |<br \/>|* 1 |  HASH JOIN               |       |     4 |   468         |     7     (15)        | 00:00:01 |<br \/>|* 2 |  TABLE ACCESS FULL       | EMP   |     4 |   348         |     3      (0)        | 00:00:01 |<br \/>|  3 |  TABLE ACCESS FULL       | DEPT  |     4 |   120         |     3      (0)        | 00:00:01 |<br \/>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<br \/>Predicate Information (identified by operation id):<br \/>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<br \/>   1 &#8211; access(&#8220;EMP&#8221;.&#8221;DEPTNO&#8221;=&#8221;DEPT&#8221;.&#8221;DEPTNO&#8221;)<br \/>   2 &#8211; filter(&#8220;EMP&#8221;.&#8221;JOB&#8221;=&#8217;CLERK&#8217;)<br \/>Note<br \/>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211;  &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;  &#8211; &#8211; &#8211;<br \/>   &#8211; dynamic sampling used for this statement<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ola, O plano da execucao das consultas podera sera executado atraves de ferramentas de terceiros ou atraves do proprio oracle. Primeiramente precisamos ter a tabela que contera os planos gerados pelo oracle ou pelas ferramentas. Para isso vamos executar o &hellip; <a href=\"https:\/\/www.soudba.com.br\/?p=184\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53,102,103,161,164,217,218,219],"tags":[],"class_list":["post-184","post","type-post","status-publish","format-standard","hentry","category-consulta-lenta","category-explain","category-explain-plan-for","category-melhorar-consulta","category-melhoria-na-consulta","category-plano-de-uma-consulta","category-plano-execucao-da-query","category-plano-execucao-ruim"],"_links":{"self":[{"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=184"}],"version-history":[{"count":0,"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=\/wp\/v2\/posts\/184\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.soudba.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}