{"id":769,"date":"2016-05-29T23:01:11","date_gmt":"2016-05-30T02:01:11","guid":{"rendered":"http:\/\/dbtimewizard.com.br\/blog\/?p=769"},"modified":"2019-11-11T18:55:54","modified_gmt":"2019-11-11T21:55:54","slug":"voce-conhece-alguma-ferramenta-para-comparar-plano-de-execucao","status":"publish","type":"post","link":"http:\/\/dbtimewizard.com.br\/blog\/voce-conhece-alguma-ferramenta-para-comparar-plano-de-execucao\/","title":{"rendered":"Voc\u00ea conhece alguma ferramenta para comparar plano de execu\u00e7\u00e3o?"},"content":{"rendered":"<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Existem situa\u00e7\u00f5es em que precisamos comparar dois planos de execu\u00e7\u00e3o para identificar suas diferen\u00e7as, quando o plano de execu\u00e7\u00e3o \u00e9 simples conseguimos realizar essa tarefa inspecionando visualmente os dois planos gerados pelo Otimizador, mas se o plano de execu\u00e7\u00e3o \u00e9 mais complexo essa tarefa pode se tornar bem dif\u00edcil.<\/span><br \/>\n<span style=\"font-size: 12pt;\">Este artigo apresenta um recurso dispon\u00edvel no SQL Developer que permite a compara\u00e7\u00e3o de dois planos de execu\u00e7\u00e3o de maneira muito simples.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para demonstrar a utiliza\u00e7\u00e3o desse recurso vamos imaginar uma situa\u00e7\u00e3o hipot\u00e9tica em que um consulta que executava numa base Oracle 9.2 tem seu plano modificado quando executada numa base Oracle 11.2.0.4.<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para essa demonstra\u00e7\u00e3o vamos utilizar o Oracle SQL Developer 4.1.3.20 e para simular a execu\u00e7\u00e3o da consulta em bases com vers\u00f5es de Oracle diferentes vamos utilizar o HINT &#8220;optimizer_features_enable&#8221;.<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Plano de execu\u00e7\u00e3o na base 11.2.0.4<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Primeiro vamos conectar numa base Oracle 11.2.0.4 com usu\u00e1rio SH e executar a nossa consulta:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-772\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela1.jpg\" alt=\"Consulta SQLDeveloper\" width=\"971\" height=\"407\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela1.jpg 971w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela1-300x126.jpg 300w\" sizes=\"auto, (max-width: 971px) 100vw, 971px\" \/><\/a><\/p>\n<p><span style=\"font-size: 12pt;\">Ap\u00f3s a execu\u00e7\u00e3o da consulta vamos acionar o \u00edcone &#8220;Explain Plan&#8221; (F10).<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-773\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela2.jpg\" alt=\"Explain Plan SQLDeveloper\" width=\"973\" height=\"429\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela2.jpg 973w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela2-300x132.jpg 300w\" sizes=\"auto, (max-width: 973px) 100vw, 973px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-size: 12pt;\">O plano de execu\u00e7\u00e3o ser\u00e1 exibido na parte inferior, logo abaixo da consulta:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-774\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela3.jpg\" alt=\"Exibe Plano de execu\u00e7\u00e3o\" width=\"965\" height=\"394\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela3.jpg 965w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela3-300x122.jpg 300w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 14pt;\">Plano de execu\u00e7\u00e3o simulando base 9.2<\/span><\/h2>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Para gerar um plano de execu\u00e7\u00e3o da mesma consulta como se ela estivesse executando numa base Oracle 9.2 vamos incluir o HINT &#8220;optimizer_features_enable(&#8216;9.2.0&#8217;)&#8221; na consulta e executa-la novamente acionando F10. Ser\u00e1 criada um nova aba na janela do plano de execu\u00e7\u00e3o com o nome &#8220;Plano de Explica\u00e7\u00e3o&#8221;:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-776\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10.jpg\" alt=\"Exibe novo plano de execu\u00e7\u00e3o\" width=\"967\" height=\"385\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10.jpg 967w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10-300x119.jpg 300w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10-880x350.jpg 880w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela4_apos_F10-600x240.jpg 600w\" sizes=\"auto, (max-width: 967px) 100vw, 967px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Selecione a aba do primeiro plano de execu\u00e7\u00e3o &#8220;V$SQL_PLAN.SQL_ID=d7528wnd7kvfc&#8221; e com o bot\u00e3o direito do mouse selecione a op\u00e7\u00e3o &#8220;Comparar com Plano de Explica\u00e7\u00e3o&#8221;:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela5.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-777\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela5.jpg\" alt=\"acionar compara\u00e7\u00e3o de plano\" width=\"966\" height=\"368\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela5.jpg 966w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela5-300x114.jpg 300w\" sizes=\"auto, (max-width: 966px) 100vw, 966px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Os dois planos ser\u00e3o exibidos lado a lado em outra aba e as opera\u00e7\u00f5es diferentes ser\u00e3o coloridas em vermelho:<\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela6.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-779\" src=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela6.jpg\" alt=\"planos de execu\u00e7\u00e3o lado a lado\" width=\"965\" height=\"367\" srcset=\"http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela6.jpg 965w, http:\/\/dbtimewizard.com.br\/blog\/wp-content\/uploads\/2016\/05\/tela6-300x114.jpg 300w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">Observando o dois planos verificamos que as opera\u00e7\u00f5es coloridas em vermelho s\u00e3o:<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">1) Opera\u00e7\u00e3o JOIN: O primeiro plano usa HASH JOIN e o segundo NESTED LOOPS<\/span><\/p>\n<p style=\"text-align: justify;\"><span style=\"font-size: 12pt;\">2) Opera\u00e7\u00e3o de acesso ao \u00edndice: O primeiro plano faz um FAST FULL SCAN enquanto o segundo faz UNIQUE 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;\">Na demonstra\u00e7\u00e3o acima utilizamos um plano de execu\u00e7\u00e3o simples para facilitar a explica\u00e7\u00e3o desse recurso no SQL Developer, mas este recurso \u00e9 mais \u00fatil quando temos dois planos de execu\u00e7\u00e3o complexos e precisamos identificar suas diferen\u00e7as. Verificamos que a opera\u00e7\u00e3o para comparar dois planos utilizando o SQL Developer \u00e9 muito simples e o resultado da compara\u00e7\u00e3o colocando os dois planos lado a lado e colorindo as opera\u00e7\u00f5es diferentes em vermelho facilita bastante a identifica\u00e7\u00e3o das diferen\u00e7as. Existem outras ferramentas no mercado que realizam esta tarefa, a vantagem do SQL Developer em rela\u00e7\u00e3o ao seus concorrentes \u00e9 que sua utiliza\u00e7\u00e3o \u00e9 livre de encargos financeiros.<\/span><\/p>\n<h2 style=\"text-align: justify;\"><span style=\"font-size: 14pt;\">Refer\u00eancias<\/span><\/h2>\n<p><strong><span style=\"font-size: 12pt;\"><a href=\"http:\/\/www.thatjeffsmith.com\/archive\/2012\/02\/quick-tip-comparing-explain-plans-with-sql-developer\/\" target=\"_blank\">http:\/\/www.thatjeffsmith.com\/archive\/2012\/02\/quick-tip-comparing-explain-plans-with-sql-developer\/<\/a><\/span><\/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>Existem situa\u00e7\u00f5es em que precisamos comparar dois planos de execu\u00e7\u00e3o para identificar suas diferen\u00e7as, quando o plano de execu\u00e7\u00e3o \u00e9 simples conseguimos realizar essa tarefa inspecionando visualmente os dois planos gerados pelo Otimizador, mas se o plano de execu\u00e7\u00e3o \u00e9 mais complexo essa tarefa pode se tornar bem dif\u00edcil. Este artigo apresenta um recurso dispon\u00edvel no SQL Developer que permite<\/p>\n","protected":false},"author":2,"featured_media":770,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[6,36,82,141,10,11],"class_list":["post-769","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-execution-plan","tag-cbo","tag-execution-plan","tag-optimizer","tag-optimizer_features_enable","tag-otimizador","tag-plano-de-execucao"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/769","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=769"}],"version-history":[{"count":14,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/769\/revisions"}],"predecessor-version":[{"id":2094,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/posts\/769\/revisions\/2094"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media\/770"}],"wp:attachment":[{"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/media?parent=769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/categories?post=769"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dbtimewizard.com.br\/blog\/wp-json\/wp\/v2\/tags?post=769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}