{"id":1495,"date":"2019-05-09T18:05:06","date_gmt":"2019-05-09T18:05:06","guid":{"rendered":"https:\/\/www.tiagoneves.net\/blog\/?p=1495"},"modified":"2019-05-10T15:37:37","modified_gmt":"2019-05-10T15:37:37","slug":"dicas-de-como-realizar-um-tuning-no-sql-server","status":"publish","type":"post","link":"https:\/\/www.tiagoneves.net\/blog\/dicas-de-como-realizar-um-tuning-no-sql-server\/","title":{"rendered":"Dicas de como realizar um tuning no SQL Server"},"content":{"rendered":"<p>Ol\u00e1 pessoal tudo certo?<\/p>\n<p>No post de hoje, eu quero compartilhar com voc\u00eas algumas dicas de como iniciar um tuning em alguma rotina, seja stored procedure, function ou query adhoc.<\/p>\n<p>Quando vamos iniciar um trabalho de tuning, uma das primeiras informa\u00e7\u00f5es que precisamos \u00e9 visualizar o plano de execu\u00e7\u00e3o da query e as informa\u00e7\u00f5es de estat\u00edsticas.<\/p>\n<p>Mas antes vamos entender um pouco os passos que o <strong>Otimizador de Consultas<\/strong> segue para executar uma query.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/query_processing_schema.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1525\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/query_processing_schema.png?resize=480%2C535&#038;ssl=1\" alt=\"\" width=\"480\" height=\"535\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/query_processing_schema.png?w=790&amp;ssl=1 790w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/query_processing_schema.png?resize=269%2C300&amp;ssl=1 269w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/query_processing_schema.png?resize=768%2C856&amp;ssl=1 768w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a><\/p>\n<p>Primeiro o Otimizador de Consultas faz o &#8220;<strong><em>Parsing<\/em><\/strong><em>&#8220;<\/em> do comando para validar se a <strong>sintaxe<\/strong> do comando est\u00e1 correta. Estando o c\u00f3digo correto, \u00e9 gerado o que chamamos de <strong><em>parser tree<\/em><\/strong>, que cont\u00e9m os <strong>passos l\u00f3gicos<\/strong> para a execu\u00e7\u00e3o da consulta SQL.<\/p>\n<p>O segundo passo \u00e9 o que chamamos de <strong>Algebrizer<\/strong>, esta etapa \u00e9 que faz a normaliza\u00e7\u00e3o do comando que recebe do <strong><em>parser tree<\/em><\/strong>, verifica a <strong>exist\u00eancia dos objetos<\/strong> utilizados na consulta (tabelas, colunas etc), al\u00e9m de outras tarefas como validar se o usu\u00e1rio que est\u00e1 executando tem permiss\u00e3o de acesso, valida as constraints e etc&#8230; a sa\u00edda deste passo \u00e9 um metadado com as informa\u00e7\u00f5es.<\/p>\n<p>O terceiro passo \u00e9 o que chamamos de <strong>Optimizer<\/strong>, que vai fazer a leitura do metadado recebidos da fase anterior e vai come\u00e7ar a analisar os <strong>operadores f\u00edsicos e l\u00f3gicos<\/strong> que ele vai utilizar, tamb\u00e9m vai analisar os <strong>hints<\/strong> que est\u00e3o na query e os operadores de JOIN. Ap\u00f3s isso, ele vai come\u00e7ar a gerar v\u00e1rios planos de execu\u00e7\u00e3o. Dentre os planos gerados ele vai escolher o que for classificado como <strong>bom o suficiente<\/strong> &#8220;<strong>good enough<\/strong>&#8220;. Para ele escolher esse plano ele leva em considera\u00e7\u00e3o o custo de cada opera\u00e7\u00e3o al\u00e9m do custo de recursos como IO e CPU.<\/p>\n<p>Uma vez que o otimizador de consultas gera o plano de execu\u00e7\u00e3o, ele \u00e9 ent\u00e3o armazenado em uma \u00e1rea de mem\u00f3ria denominada <strong><em>plan cache<\/em><\/strong>, que \u00e9 uma \u00e1rea onde ficam armazenados todos os planos de execu\u00e7\u00e3o do SQL Server.<\/p>\n<p>Conclu\u00eddo o terceiro passo, agora que o nosso plano de execu\u00e7\u00e3o est\u00e1 gerado o SQL Server sabe exatamente como chegar nos dados, ent\u00e3o ele \u00e9 colocado na fila de execu\u00e7\u00e3o que \u00e9 o passo <strong>Execution<\/strong> ou <strong>Exec Plan.<\/strong><\/p>\n<p><span style=\"color: #000000;\"><strong>1) Plano de Execu\u00e7\u00e3o<\/strong><\/span><\/p>\n<p><strong>Tiago o que seria o plano de execu\u00e7\u00e3o?<\/strong><\/p>\n<p>Apesar de quase 100% das pessoas que trabalham com SQL Server saber o que \u00e9 o plano de execu\u00e7\u00e3o e para que ele serve, se voc\u00ea est\u00e1 come\u00e7ando a trabalhar com banco de dados agora, vou dar uma resumida. O primeiro ponto \u00e9 que o Plano de Execu\u00e7\u00e3o n\u00e3o \u00e9 exclusivo do SQL Server, todos os SGBD que eu conhe\u00e7o tem planos de execu\u00e7\u00e3o (Oracle, MySQL, Postgree&#8230;), que nada mais \u00e9 que uma representa\u00e7\u00e3o gr\u00e1fica, textual ou em XML que mostra quais operadores e opera\u00e7\u00f5es que o otimizador de consultas fez para retornar os dados da sua query e tamb\u00e9m o custo de cada opera\u00e7\u00e3o realizada.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/execution_plan.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1499 aligncenter\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/execution_plan.png?resize=678%2C153&#038;ssl=1\" alt=\"\" width=\"678\" height=\"153\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/execution_plan.png?w=962&amp;ssl=1 962w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/execution_plan.png?resize=300%2C68&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/execution_plan.png?resize=768%2C173&amp;ssl=1 768w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Com esse recurso voc\u00ea consegue ver as etapas de execu\u00e7\u00e3o da sua query e assim verificar o que pode ser melhorado.<\/p>\n<p>Para gerar um plano de execu\u00e7\u00e3o de uma instru\u00e7\u00e3o voc\u00ea pode simplesmente utilizar o atalho &#8220;<strong><em>CTRL+M<\/em><\/strong>&#8221; ou ent\u00e3o clicar no \u00edcone:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1498 aligncenter\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan.png?resize=678%2C102&#038;ssl=1\" alt=\"\" width=\"678\" height=\"102\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan.png?w=860&amp;ssl=1 860w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan.png?resize=300%2C45&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan.png?resize=768%2C116&amp;ssl=1 768w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>O plano de execu\u00e7\u00e3o tamb\u00e9m pode nos dar informa\u00e7\u00e3o de sugest\u00e3o de \u00edndices do SQL Server.<\/p>\n<p><strong>Mas o que seria essas sugest\u00f5es de cria\u00e7\u00e3o de \u00edndices?<\/strong><\/p>\n<p>Por exemplo, quando executamos uma consulta o otimizador de consultas utiliza as estat\u00edsticas e identifica que a query que voc\u00ea est\u00e1 executando teria um desempenho melhor se a tabela X tivesse um \u00edndice na coluna Y.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1500 aligncenter\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?resize=678%2C117&#038;ssl=1\" alt=\"\" width=\"678\" height=\"117\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?w=1287&amp;ssl=1 1287w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?resize=300%2C52&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?resize=768%2C132&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_execution_plan_sugest_index.png?resize=1024%2C177&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Como podemos observar na imagem acima, o otimizador de consultas est\u00e1 nos sugerindo um \u00edndice na tabela &#8220;<strong><em>Sales.Customer<\/em><\/strong>&#8220;, que vai gerar um impacto de &#8220;<strong>97%<\/strong>&#8221; na execu\u00e7\u00e3o da consulta.<\/p>\n<p>Para fazer a leitura do plano de execu\u00e7\u00e3o as literaturas recomendam que devemos come\u00e7ar da esquerda para a direita e de cima para baixo, uma vez que facilita a nossa interpreta\u00e7\u00e3o. Por\u00e9m, o <strong>Otimizador de Consultas constr\u00f3i os planos de execu\u00e7\u00e3o da direita para a esquerda e de cima para baixo<\/strong>. Tamb\u00e9m precisamos aprender o que significa cada operador ou pelo menos os principais deles.<\/p>\n<p>Para consultar os operadores podemos consultar o Books Online (<u><a href=\"https:\/\/docs.microsoft.com\/pt-br\/sql\/relational-databases\/showplan-logical-and-physical-operators-reference?view=sql-server-2017\">BOL<\/a><\/u>).<\/p>\n<p>Vamos entender melhor com um plano de execu\u00e7\u00e3o um pouco mais complexo. Vamos exibir o plano de execu\u00e7\u00e3o da query abaixo:<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\">WITH\nLastDayOrderIDs AS\n(\nSELECT SalesOrderID FROM Sales.SalesOrderHeader\nWHERE OrderDate = (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader)\n),\nLastDayProductQuantities AS\n(\nSELECT ProductID, SUM(OrderQty) AS LastDayQuantity\nFROM Sales.SalesOrderDetail\nJOIN LastDayOrderIDs\nON Sales.SalesOrderDetail.SalesOrderID = LastDayOrderIDs.SalesOrderID\nGROUP BY ProductID\n),\n\nLastDayProductDetails AS\n(\nSELECT\nProduct.ProductID,\nProduct.Name,\nLastDayQuantity\nFROM Production.Product\nJOIN LastDayProductQuantities\nON Product.ProductID = LastDayProductQuantities.ProductID\n)\n\nSELECT * FROM LastDayProductDetails\nORDER BY LastDayQuantity DESC;\n\n<\/pre>\n<p>Para entender o plano vamos utilizar a recomenda\u00e7\u00e3o liter\u00e1ria que fica mais f\u00e1cil o entendimento.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1517\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?resize=678%2C164&#038;ssl=1\" alt=\"\" width=\"678\" height=\"164\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?w=1882&amp;ssl=1 1882w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?resize=300%2C73&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?resize=768%2C186&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?resize=1024%2C248&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/understandexecution_plan.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>1 &#8211; Otimizador de consulta executou uma opera\u00e7\u00e3o de &#8220;<em>Cluster Index Scan<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan-1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1519\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan-1.png?resize=228%2C98&#038;ssl=1\" alt=\"\" width=\"228\" height=\"98\"><\/a><\/p>\n<p>3 &#8211; Realizou outra opera\u00e7\u00e3o de &#8220;<em>Cluster Index Scan<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1520\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?resize=239%2C82&#038;ssl=1\" alt=\"\" width=\"239\" height=\"82\"><\/a><\/p>\n<p>4 &#8211; Fez uma agrega\u00e7\u00e3o dos dados utilizando o operador &#8220;<em>Stream Aggregate<\/em>&#8220;, essa primeira agrega\u00e7\u00e3o \u00e9 referente a fun\u00e7\u00e3o <strong>MAX<\/strong> (<strong>SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader<\/strong>)<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1509\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?resize=109%2C72&#038;ssl=1\" alt=\"\" width=\"109\" height=\"72\"><\/a><\/p>\n<p><strong>Dica:<\/strong> Quando clicamos com o <em>bot\u00e3o direito -&gt; propriedades<\/em> do operador, temos as informa\u00e7\u00f5es do que o operador est\u00e1 fazendo.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1510\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate.png?resize=672%2C703&#038;ssl=1\" alt=\"\" width=\"672\" height=\"703\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate.png?w=672&amp;ssl=1 672w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate.png?resize=287%2C300&amp;ssl=1 287w\" sizes=\"auto, (max-width: 672px) 100vw, 672px\" \/><\/a><\/p>\n<p>5 &#8211; Realizou outra opera\u00e7\u00e3o de &#8220;<em>Cluster Index Scan<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1520\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?resize=239%2C82&#038;ssl=1\" alt=\"\" width=\"239\" height=\"82\"><\/a><\/p>\n<p>6 &#8211; Fez o join dos dados atrav\u00e9s do operador &#8220;<em>Nested Loops<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1511\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?resize=86%2C75&#038;ssl=1\" alt=\"\" width=\"86\" height=\"75\"><\/a><\/p>\n<p>7 &#8211; Agora fez uma opera\u00e7\u00e3o de &#8220;<em>Cluster Index Seek&#8221;<\/em><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_seek.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1521\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_seek.png?resize=247%2C80&#038;ssl=1\" alt=\"\" width=\"247\" height=\"80\"><\/a><\/p>\n<p>8 &#8211; Realizou o join entre os resultados dos passos (4,5,6 e 7) com o operador &#8220;<em>Nested Loops<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1511\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?resize=86%2C75&#038;ssl=1\" alt=\"\" width=\"86\" height=\"75\"><\/a><\/p>\n<p>9 &#8211; Realizou a ordena\u00e7\u00e3o dos dados utilizando o operador de &#8220;<em>Sort<\/em>&#8221;<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1522\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?resize=64%2C62&#038;ssl=1\" alt=\"\" width=\"64\" height=\"62\"><\/a><\/p>\n<p>10 &#8211; Fez uma nova agrega\u00e7\u00e3o dos dados por causa do &#8220;<em>Group By&#8221; &#8211; (<\/em><strong>GROUP BY ProductID<\/strong><em>)<\/em><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1509\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?resize=109%2C72&#038;ssl=1\" alt=\"\" width=\"109\" height=\"72\"><\/a><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate_groupby.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1518\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate_groupby.png?resize=675%2C578&#038;ssl=1\" alt=\"\" width=\"675\" height=\"578\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate_groupby.png?w=675&amp;ssl=1 675w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_stream_aggregate_groupby.png?resize=300%2C257&amp;ssl=1 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><\/a><\/p>\n<p>2 &#8211; Agora com a segunda parte dos dados da query j\u00e1 retornados, o otimizador de consultas vai realizar o join utilizando o operador &#8220;<em>Merge Join<\/em>&#8220;.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/merge_join-e1543284626964.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1508\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/merge_join-e1543284626964.png?resize=80%2C73&#038;ssl=1\" alt=\"\" width=\"80\" height=\"73\"><\/a><\/p>\n<p>11 &#8211; Vai realizar mais uma ordena\u00e7\u00e3o utilizando o operador &#8220;<em>Sort&#8221; <\/em>ordenando os dados da CTE (<strong>ORDER BY LastDayQuantity DESC;<\/strong>)<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1522\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?resize=64%2C62&#038;ssl=1\" alt=\"\" width=\"64\" height=\"62\"><\/a><\/p>\n<p>12 &#8211; Finalmente vai retornar os dados do Select.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/select_operator.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1523\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/select_operator.png?resize=69%2C67&#038;ssl=1\" alt=\"\" width=\"69\" height=\"67\"><\/a><\/p>\n<p>Agora vamos ver como que o Otimizador de Consulta monta o plano de execu\u00e7\u00e3o, como dito anteriormente, ele monta o plano da direita para a esquerda.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1524\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?resize=678%2C147&#038;ssl=1\" alt=\"\" width=\"678\" height=\"147\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?w=1882&amp;ssl=1 1882w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?resize=300%2C65&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?resize=768%2C166&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?resize=1024%2C221&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/executionplan_sql.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Como explicado anteriormente, quando executamos uma query ela passa por algumas fases e na fase do <strong>Optimizer<\/strong> que ser\u00e1 gerado o plano de execu\u00e7\u00e3o. Com isso, a engine sabe exatamente o caminho, ordem e quais operadores ela vai utilizar para alcan\u00e7ar o objetivo. Por esse motivo, ele gerar os planos sempre da direita para esquerda.<\/p>\n<p>1 &#8211; Select<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/select_operator.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1523\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/select_operator.png?resize=69%2C67&#038;ssl=1\" alt=\"\" width=\"69\" height=\"67\"><\/a><\/p>\n<p>2 &#8211; Sort<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1522\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?resize=64%2C62&#038;ssl=1\" alt=\"\" width=\"64\" height=\"62\"><\/a><\/p>\n<p>3 &#8211; Merge Join<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/merge_join-e1543284626964.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1508\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/merge_join-e1543284626964.png?resize=80%2C73&#038;ssl=1\" alt=\"\" width=\"80\" height=\"73\"><\/a><\/p>\n<p>4 &#8211; Cluster Index Scan<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan-1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1519\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan-1.png?resize=228%2C98&#038;ssl=1\" alt=\"\" width=\"228\" height=\"98\"><\/a><\/p>\n<p>5 &#8211; Stream Aggregate<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1509\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?resize=109%2C72&#038;ssl=1\" alt=\"\" width=\"109\" height=\"72\"><\/a><\/p>\n<p>6 &#8211; Sort<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1522\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/Sort.png?resize=64%2C62&#038;ssl=1\" alt=\"\" width=\"64\" height=\"62\"><\/a><\/p>\n<p>7 &#8211; Nested Loops<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1511\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?resize=86%2C75&#038;ssl=1\" alt=\"\" width=\"86\" height=\"75\"><\/a><\/p>\n<p>8 &#8211; Nested Loops<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1511\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/nested_loop_1.png?resize=86%2C75&#038;ssl=1\" alt=\"\" width=\"86\" height=\"75\"><\/a><\/p>\n<p>9 &#8211; Stream Aggregate<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1509\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/stream_aggregate.png?resize=109%2C72&#038;ssl=1\" alt=\"\" width=\"109\" height=\"72\"><\/a><\/p>\n<p>10 &#8211; Cluster Index Scan<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1520\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?resize=239%2C82&#038;ssl=1\" alt=\"\" width=\"239\" height=\"82\"><\/a><\/p>\n<p>11 &#8211; Cluster Index Scan<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1520\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_scan_sales.png?resize=239%2C82&#038;ssl=1\" alt=\"\" width=\"239\" height=\"82\"><\/a><\/p>\n<p>12 &#8211; Cluster Index Seek<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_seek.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1521\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/cluster_index_seek.png?resize=247%2C80&#038;ssl=1\" alt=\"\" width=\"247\" height=\"80\"><\/a><\/p>\n<p>Para voc\u00ea identificar qual \u00e9 a ordem que o plano est\u00e1 sendo executado, voc\u00ea consegue essa informa\u00e7\u00e3o nas propriedades de cada operador, na propriedade Node ID lembrando que a contagem come\u00e7a no Node ID: 0.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_nodeID.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1527\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_nodeID.png?resize=674%2C641&#038;ssl=1\" alt=\"\" width=\"674\" height=\"641\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_nodeID.png?w=674&amp;ssl=1 674w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/properties_nodeID.png?resize=300%2C285&amp;ssl=1 300w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/a><\/p>\n<p>Outra op\u00e7\u00e3o que nos ajuda a entender a ordem que o SQL Server est\u00e1 executando a nossa query \u00e9 habilitando a op\u00e7\u00e3o &#8220;<strong>set statistics profile on<\/strong>&#8220;.<\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\"><strong>SET STATISTICS PROFILE ON<\/strong>\n\nWITH LastDayOrderIDs\nAS (SELECT SalesOrderID\n    FROM Sales.SalesOrderHeader\n    WHERE OrderDate =\n    (\n        SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader\n    )),\n     LastDayProductQuantities\nAS (SELECT ProductID,\n           SUM(OrderQty) AS LastDayQuantity\n    FROM Sales.SalesOrderDetail\n        JOIN LastDayOrderIDs\n            ON Sales.SalesOrderDetail.SalesOrderID = LastDayOrderIDs.SalesOrderID\n    GROUP BY ProductID),\n     LastDayProductDetails\nAS (SELECT Product.ProductID,\n           Product.Name,\n           LastDayQuantity\n    FROM Production.Product\n        JOIN LastDayProductQuantities\n            ON Product.ProductID = LastDayProductQuantities.ProductID)\nSELECT *\nFROM LastDayProductDetails\nORDER BY LastDayQuantity DESC<\/pre>\n<p>O retorno dessas informa\u00e7\u00f5es nos ajuda a identificar a ordem dos operadores e tamb\u00e9m quais s\u00e3o os operadores f\u00edsicos e quais s\u00e3o os operadores l\u00f3gicos, al\u00e9m de outras informa\u00e7\u00f5es.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1528\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?resize=678%2C89&#038;ssl=1\" alt=\"\" width=\"678\" height=\"89\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?w=1874&amp;ssl=1 1874w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?resize=300%2C40&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?resize=768%2C101&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?resize=1024%2C135&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/11\/set_statistics_profile.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Como falamos no come\u00e7o do post, outro ponto muito importante a ser observado s\u00e3o as estat\u00edsticas da query, quantas opera\u00e7\u00f5es de leituras f\u00edsicas, l\u00f3gicas e consumo de CPU o SQL Server efetuou para executar a sua consulta.<\/p>\n<p>Para obter essas informa\u00e7\u00f5es basta habilitar as estat\u00edsticas antes de executar o comando, &#8220;<strong><em>set statistics io,time on<\/em><\/strong><em>&#8221; .<\/em><\/p>\n<pre class=\"theme:ssms2012 lang:tsql decode:true\"><strong>SET STATISTICS IO,time ON<\/strong>\n\nWITH LastDayOrderIDs\nAS (SELECT SalesOrderID\n    FROM Sales.SalesOrderHeader\n    WHERE OrderDate =\n    (\n        SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader\n    )),\n     LastDayProductQuantities\nAS (SELECT ProductID,\n           SUM(OrderQty) AS LastDayQuantity\n    FROM Sales.SalesOrderDetail\n        JOIN LastDayOrderIDs\n            ON Sales.SalesOrderDetail.SalesOrderID = LastDayOrderIDs.SalesOrderID\n    GROUP BY ProductID),\n     LastDayProductDetails\nAS (SELECT Product.ProductID,\n           Product.Name,\n           LastDayQuantity\n    FROM Production.Product\n        JOIN LastDayProductQuantities\n            ON Product.ProductID = LastDayProductQuantities.ProductID)\nSELECT *\nFROM LastDayProductDetails\nORDER BY LastDayQuantity DESC<\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1530\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?resize=678%2C117&#038;ssl=1\" alt=\"\" width=\"678\" height=\"117\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?w=1203&amp;ssl=1 1203w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?resize=300%2C52&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?resize=768%2C133&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/set_statistics_iotime.png?resize=1024%2C177&amp;ssl=1 1024w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Como podemos ver nas informa\u00e7\u00f5es estat\u00edsticas, a opera\u00e7\u00e3o mais custosa para a execu\u00e7\u00e3o da consulta foi a leitura na tabela &#8220;<strong><em>SalesOrderHeader<\/em><\/strong>&#8221; e a nossa consulta teve um custo de <strong>9 ms<\/strong>.<\/p>\n<p>Apenas uma observa\u00e7\u00e3o para quem n\u00e3o conhece a opera\u00e7\u00e3o de <strong>logical reads<\/strong>, pois n\u00e3o \u00e9 uma leitura dos dados no disco e sim na mem\u00f3ria. Quando existe leitura em disco o valor que ser\u00e1 mostrado \u00e9 a o <strong>physical reads <\/strong>em alguns casos quando os dados ainda n\u00e3o est\u00e3o em mem\u00f3ria o SQL pode fazer leitura f\u00edsica, mas na pr\u00f3xima execu\u00e7\u00e3o da consulta os valores estejam zerado, isso vai depender de como estiver o seu PLE (<strong>Page Life &nbsp;Expectancy &#8211; <\/strong><em>Expectativa de vida em segundos de uma p\u00e1gina na mem\u00f3ria do SQL Server, bom para monitorar se voc\u00ea est\u00e1 mantendo dados em cache por muito tempo, evitando acessos a disco<\/em><strong>).<\/strong><\/p>\n<p>Existe uma ferramenta que utilizo bastante que \u00e9 a <u><a href=\"https:\/\/www.sentryone.com\/plan-explorer?utm_source=PlanExplorer&amp;utm_medium=client&amp;utm_campaign=VersionChecker\" target=\"_blank\" rel=\"noopener noreferrer\">SentryOne Plan Explorer<\/a><\/u>. Ela \u00e9 <strong>FREE<\/strong> e nos ajuda bastante quando vamos realizar um tuning.<\/p>\n<p>Quando executamos uma query nessa ferramenta, ela retorna os planos de execu\u00e7\u00e3o, estat\u00edsticas, qual opera\u00e7\u00e3o foi mais custosa para o SQL Serve executar&#8230; Costumo dizer que \u00e9 uma ferramenta fant\u00e1stica, nos prints abaixo vamos poder ver as informa\u00e7\u00f5es que ela nos retorna.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1532\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Quando vamos utilizar o <strong>plan explorer<\/strong> devemos clicar em <strong>&#8220;<em>New Plan Explorer Session<\/em>&#8220;<\/strong>.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1533\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?resize=678%2C369&#038;ssl=1\" alt=\"\" width=\"678\" height=\"369\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?w=1919&amp;ssl=1 1919w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?resize=768%2C418&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?resize=1024%2C558&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_2.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Depois de escrever a sua query, voc\u00ea dever\u00e1 clicar em <strong>&#8220;<em>Get Actual Plan&#8221;<\/em><\/strong> e preencher as informa\u00e7\u00f5es de acesso ao banco como inst\u00e2ncia, base de dados e login\/senha.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1534\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_tableio.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Como podemos observar, a nossa primeira execu\u00e7\u00e3o da query foi com o tempo de <strong>24 ms<\/strong>, tamb\u00e9m podemos ver as informa\u00e7\u00f5es de <strong>&#8220;<em>Table I\/O&#8221;<\/em><\/strong><em>, <\/em>que s\u00e3o as informa\u00e7\u00f5es de I\/O que a nossa consulta executou. Essa informa\u00e7\u00e3o \u00e9 a mesma que temos quando executamos o &#8220;<em>set statistics io&#8221;, <\/em>no Management Studio.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1536\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?resize=768%2C417&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?resize=1024%2C556&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_queyrcolumn2.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Na aba <strong><em>&#8220;Query Columns&#8221;<\/em><\/strong><em> podemos<\/em> ter informa\u00e7\u00f5es sobre quais colunas e tabelas que a nossa query acessou e qual o custo de cada acesso.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1537\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?w=1922&amp;ssl=1 1922w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_plan_diagram.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Na aba <strong><em>&#8220;Plan Diagram&#8221;<\/em><\/strong><em>, <\/em>n\u00f3s temos o mesmo plano de execu\u00e7\u00e3o que conseguimos quando executamos a consulta no Management Studio. Por\u00e9m no Plan Explorer ele nos mostra quais foram as tops opera\u00e7\u00f5es.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1538\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?resize=768%2C417&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?resize=1024%2C556&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_Join.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Na aba <strong><em>&#8220;Join Diagram&#8221;<\/em><\/strong><em>, <\/em>n\u00f3s temos um diagrama dos relacionamentos das tabelas da query.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1539\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?resize=678%2C367&#038;ssl=1\" alt=\"\" width=\"678\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_planTre.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Semelhante ao &#8220;<em>set statistics profile<\/em>&#8221; no Management Studio, a aba <strong><em>&#8220;Plan Tree&#8221;<\/em><\/strong> nos informa a ordem do steps que o SQL Server fez para executar a nossa query.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1540\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?resize=678%2C367&#038;ssl=1\" alt=\"\" width=\"678\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?resize=300%2C162&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?resize=1024%2C554&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_topoperation.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>A aba <strong><em>&#8220;Top Operations&#8221;<\/em><\/strong><em>, <\/em>retorna uma tabela com os custos de cada opera\u00e7\u00e3o do plano de execu\u00e7\u00e3o bem como as estimativas, se o operador utilizou paralelismo para executar entre outras.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1541\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?resize=678%2C367&#038;ssl=1\" alt=\"\" width=\"678\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Por fim, a aba <strong>&#8220;<em>Index Analysis<\/em>&#8220;<\/strong> faz uma an\u00e1lise de cada \u00edndice que foi utilizado na nossa consulta, inclusive mostrando o ganho que ter\u00edamos ao utilizar o \u00edndice sugerido pelo SQL Server. Tamb\u00e9m podemos ver que algumas estat\u00edsticas est\u00e3o desatualizadas.<\/p>\n<p>O legal da ferramenta \u00e9 que podemos atualizar as estat\u00edsticas e criar o \u00edndice direto por ela sem precisar de conectar no Management Studio.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1542\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?resize=678%2C361&#038;ssl=1\" alt=\"\" width=\"678\" height=\"361\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?resize=300%2C160&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?resize=768%2C408&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?resize=1024%2C545&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_updateStatisticas.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Para atualizar as estat\u00edsticas no pr\u00f3prio SentryOne, basta clicar no gr\u00e1fico que vai abrir uma janela para voc\u00ea configurar as op\u00e7\u00f5es de atualiza\u00e7\u00e3o de estat\u00edsticas, lembrando que se voc\u00ea n\u00e3o tiver <strong>permiss\u00e3o<\/strong> para atualizar estat\u00edsticas vai dar erro.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1543\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?resize=678%2C367&#038;ssl=1\" alt=\"\" width=\"678\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?resize=300%2C162&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?resize=1024%2C554&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_index_analysis_createIndex.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>D\u00e1 mesma forma, podemos criar um \u00edndice sugerido pelo SQL Server. Para isso, basta clicar no <strong><em>&#8220;&lt;s&gt;&#8221;<\/em><\/strong> que o Plan Explorer vai mostrar o script de cria\u00e7\u00e3o do \u00edndice e caso voc\u00ea ache necess\u00e1rio acrescentar alguma coluna ou alguma op\u00e7\u00e3o de cria\u00e7\u00e3o basta editar o script.<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Aten\u00e7\u00e3o:<\/strong><\/span><\/p>\n<p><span style=\"color: #000000;\"><em><strong>&#8220;Criar \u00edndices e atualizar estatisticas em ambiente de produ\u00e7\u00e3o durante o hor\u00e1rio comercial pode impactar a performance do servidor e gerar locks.&#8221;<\/strong><\/em><\/span><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1545\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?resize=678%2C368&#038;ssl=1\" alt=\"\" width=\"678\" height=\"368\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_5.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?ssl=1\" rel=\"lightbox[1495]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1547\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?resize=678%2C367&#038;ssl=1\" alt=\"\" width=\"678\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?w=1920&amp;ssl=1 1920w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?resize=300%2C163&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?resize=768%2C416&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?resize=1024%2C555&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/12\/plan_explorer_7-1.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/p>\n<p>Por fim, no painel direito temos um hist\u00f3rico de execu\u00e7\u00e3o da nossa query, onde podemos analisar e comparar as execu\u00e7\u00f5es e ver se tivemos algum ganho. Como podemos verificar, ap\u00f3s atualizar as estat\u00edsticas e criar o \u00edndice sugerido pelo SQL Server, a nossa query baixou a quantidade de I\/O de <strong>1.562<\/strong> para <strong>169<\/strong> e consequentemente o tempo de <strong>24 ms<\/strong> para <strong>02 ms<\/strong>, al\u00e9m de gerar um novo plano de execu\u00e7\u00e3o.<\/p>\n<p>Como podemos ver, temos N formas de executar um tuning, al\u00e9m de ferramentas como o <strong>SentryOne Plan Explorer<\/strong> existem outras, mas n\u00e3o adianta voc\u00ea ter as ferramentas se voc\u00ea n\u00e3o tiver uma no\u00e7\u00e3o dos operadores, qual est\u00e1 sendo o seu gargalo e etc&#8230;<\/p>\n<p>Abaixo vou indicar alguns links com os v\u00eddeos dos treinamentos On-demand do Fabiano Amorim e do Luti. Os treinamentos est\u00e3o disponibilizados no Youtube em seus respectivos canais.<\/p>\n<p>Treinamento <a href=\"https:\/\/www.youtube.com\/user\/mcflyamorim\/playlists\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Fabiano<\/strong> <\/a>&#8211; <strong>PE Parte I &#8211; QO, lookup, sort e merge join<\/strong>:<\/p>\n<div class=\"jetpack-video-wrapper\"><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"678\" height=\"382\" src=\"https:\/\/www.youtube.com\/embed\/u29uI5gKRyU?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PL3hmzvdnIMYqX1aGj11OwKwC7adRR1nAu\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span><\/div>\n<p>Treinamento <a href=\"https:\/\/www.youtube.com\/channel\/UCaDiCu2LF-PRkswTKrLSpow\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Luti<\/strong> <\/a>&#8211; <strong>Indexa\u00e7\u00e3o<\/strong>:<\/p>\n<div class=\"jetpack-video-wrapper\"><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"678\" height=\"382\" src=\"https:\/\/www.youtube.com\/embed\/LfYV0gmlldI?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PLGaWZx_3bztdIJscZJjkS39KW0TbaNpLF\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span><\/div>\n<p>O #TeamFabricioLima lan\u00e7ou uma plataforma de <a href=\"https:\/\/cursos.fabriciolima.net\" target=\"_blank\" rel=\"noopener noreferrer\">curso<\/a> e temos alguns treinamentos do Fabiano, hoje (08\/05\/2019) temos o 25 Dicas de Performance no SQL Server Parte 1, + 25 Dicas de Performance no SQL Server Parte 2.<\/p>\n<p>Para quem quiser adquirir alguns do cursos do Fabiano na plataforma do #TeamFabricioLima (<a href=\"https:\/\/cursos.fabriciolima.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/cursos.fabriciolima.net\/<\/a>), use esse cupom de desconto &#8220;<strong>BLOGTIAGONEVES10<\/strong>&#8220;.<\/p>\n<p><strong>Referencias<\/strong>:<\/p>\n<p><a href=\"https:\/\/www.apress.com\/br\/book\/9781484238875\" target=\"_blank\" rel=\"noopener noreferrer\">SQL Server 2017 Query Performance Tuning &#8211; Troubleshoot and Optimize Query Performance<\/a> &#8211; <strong>Fritchey, Gran<\/strong><\/p>\n<p><a href=\"https:\/\/www.apress.com\/br\/book\/9781484222706\" target=\"_blank\" rel=\"noopener noreferrer\">High Performance SQL Server<\/a> &#8211; <strong>Nevarez, Benjamin<\/strong><\/p>\n<p>Bom pessoal por hoje \u00e9 isso. Espero que tenham gostado e espero ter ajudado quem est\u00e1 come\u00e7ando a trabalhar com tuning.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Curta a nossa p\u00e1gina no <a href=\"https:\/\/www.facebook.com\/TiagoNevesDBA\" target=\"_blank\" rel=\"noreferrer noopener nofollow external\" aria-label=\"Facebook (opens in a new tab)\" data-wpel-link=\"external\">Facebook<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 pessoal tudo certo? No post de hoje, eu quero compartilhar com voc\u00eas algumas dicas de como iniciar um tuning em alguma rotina, seja stored procedure, function ou query adhoc. Quando vamos iniciar um trabalho de tuning, uma das primeiras informa\u00e7\u00f5es que precisamos \u00e9 visualizar o plano de execu\u00e7\u00e3o da query e as informa\u00e7\u00f5es de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1801,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rop_custom_images_group":[],"rop_custom_messages_group":[],"rop_publish_now":"initial","rop_publish_now_accounts":{"twitter_91251433_91251433":""},"rop_publish_now_history":[],"rop_publish_now_status":"pending","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"No post de hoje, eu quero compartilhar com voc\u00eas algumas dicas de como iniciar um tuning em alguma rotina, seja stored procedure, function ou query adhoc.","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpscppro_dont_share_socialmedia":false,"_wpscppro_custom_social_share_image":0,"_facebook_share_type":"","_twitter_share_type":"","_linkedin_share_type":"","_pinterest_share_type":"","_linkedin_share_type_page":"","_instagram_share_type":"","_medium_share_type":"","_threads_share_type":"","_google_business_share_type":"","_selected_social_profile":[],"_wpsp_enable_custom_social_template":false,"_wpsp_social_scheduling":{"enabled":false,"datetime":null,"platforms":[],"status":"template_only","dateOption":"today","timeOption":"now","customDays":"","customHours":"","customDate":"","customTime":"","schedulingType":"absolute"},"_wpsp_active_default_template":true},"categories":[2,20,239],"tags":[241,223,203,245,244,267,240],"class_list":["post-1495","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-casos-do-dia-a-dia","category-sqlserver-geral","category-tuning","tag-alwaystuningyourdata","tag-dba-remoto","tag-dba-vitoria","tag-executionplan","tag-otimizador-de-consulta","tag-performance-tuning","tag-tuning"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/05\/word-image-3-1.png?fit=352%2C278&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6eIyh-o7","jetpack-related-posts":[{"id":2414,"url":"https:\/\/www.tiagoneves.net\/blog\/sql-server-2016-esta-chegando-ao-fim-do-suporte-o-que-isso-significa-na-pratica\/","url_meta":{"origin":1495,"position":0},"title":"SQL Server 2016 est\u00e1 chegando ao fim do suporte: o que isso significa na pr\u00e1tica?","author":"tiagoneves","date":"27 de abril de 2026","format":false,"excerpt":"O SQL Server 2016 ter\u00e1 seu suporte estendido encerrado em 14 de julho de 2026, o que resultar\u00e1 na falta de atualiza\u00e7\u00f5es de seguran\u00e7a e suporte. Continuar usando essa vers\u00e3o traz riscos como vulnerabilidades e n\u00e3o conformidade regulat\u00f3ria. Planejar a migra\u00e7\u00e3o para vers\u00f5es mais recentes ou cloud deve ser prioridade\u2026","rel":"","context":"Em &quot;Seguran\u00e7a&quot;","block_context":{"text":"Seguran\u00e7a","link":"https:\/\/www.tiagoneves.net\/blog\/category\/seguranca\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=700%2C400 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/1495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/comments?post=1495"}],"version-history":[{"count":11,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/1495\/revisions"}],"predecessor-version":[{"id":1804,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/1495\/revisions\/1804"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media\/1801"}],"wp:attachment":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media?parent=1495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/categories?post=1495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/tags?post=1495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}