{"id":2325,"date":"2013-09-03T22:59:33","date_gmt":"2013-09-04T00:59:33","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=2325"},"modified":"2016-07-23T23:56:02","modified_gmt":"2016-07-24T02:56:02","slug":"casos-do-dia-a-dia-o-que-a-falta-de-paralelismo-pode-fazer-a-uma-query","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2013\/09\/03\/casos-do-dia-a-dia-o-que-a-falta-de-paralelismo-pode-fazer-a-uma-query\/","title":{"rendered":"Casos do Dia a Dia &#8211; O que a falta de paralelismo pode fazer a uma query"},"content":{"rendered":"<p>Ol\u00e1 Pessoal,<\/p>\n<p>Segue mais um caso que aconteceu no meu dia a dia de trabalho.<\/p>\n<p>A equipe de desenvolvimento nos passou uma query onde o resultado de um select era associado a uma vari\u00e1vel dentro do pr\u00f3prio select.<\/p>\n<p>ex: select <strong>@temp = @temp +<\/strong> (case when then end) from [v\u00e1rios joins] where [v\u00e1rias verifica\u00e7\u00f5es]\n<p>Essa query demorava <strong>40 segundos<\/strong>, mas ao executar da forma abaixo (eliminando <strong>o @temp +<\/strong>):<\/p>\n<p>ex: select <strong>@temp =<\/strong> (case when then end) from [v\u00e1rios joins] where [v\u00e1rias verifica\u00e7\u00f5es]\n<p>Ela demorava <strong>ZERO segundos<\/strong>.<\/p>\n<p>Olhando o execution plan, foi poss\u00edvel verificar que a primeira query demorava pois o SQL Server n\u00e3o usava paralelismo, j\u00e1 para a segunda query, usava.<\/p>\n<p>Nossa solu\u00e7\u00e3o de contorno foi passar o resultado do select para uma outra vari\u00e1vel e ap\u00f3s o select somar a vari\u00e1vel original.<\/p>\n<p>ex: select <strong>@temp2 =<\/strong> (case when then end) from [v\u00e1rios joins] where [v\u00e1rias verifica\u00e7\u00f5es]\n<p>set\u00a0 <strong><strong>@temp<\/strong> = <strong>@temp<\/strong> + @temp2<\/strong><\/p>\n<p>Um dos motivos poderia ser porque o SQL Server determinou um custo mais baixo para a primeira query a ponto de n\u00e3o usar paralelismo de acordo com a defini\u00e7\u00e3o do &#8220;cost <em>threshold for parallelism<\/em>&#8220;. Contudo, n\u00e3o consegui evidenciar isso.<\/p>\n<p>Olhando numa vis\u00e3o mais leiga, parece ser uma opera\u00e7\u00e3o simples somar o valor de uma vari\u00e1vel a ela mesma e \u00e9 dif\u00edcil de saber porque o SQL Server tomou caminhos diferentes tornando a query t\u00e3o mais lenta.<\/p>\n<p>A discuss\u00e3o fica aberta nos coment\u00e1rios para quem souber dar mais detalhes do motivo desse problema.<\/p>\n<p>Ambiente: Win Server 2008 R2 e SQL Server 2008 R2 com a atualiza\u00e7\u00e3o mais recente.<\/p>\n<p><b>Gostou dessa dica?<\/b><\/p>\n<p>Cadastre seu e-mail para receber novos Posts e curta minha <a href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\">P\u00e1gina no Facebook<\/a> para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Confira mais experi\u00eancias do Dia a Dia de um DBA no meu <a href=\"https:\/\/www.fabriciolima.net\/cursos-online\/treinamento-tarefas-do-dia-a-dia-de-um-dba-online\/\" target=\"_blank\">Treinamento de Tarefas do Dia a Dia de um DBA<\/a>.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 Pessoal, Segue mais um caso que aconteceu no meu dia a dia de trabalho. A equipe de desenvolvimento nos passou uma query onde o resultado de um select era associado a uma vari\u00e1vel dentro do pr\u00f3prio select. ex: select @temp = @temp + (case when then end) from [v\u00e1rios joins] where [v\u00e1rias verifica\u00e7\u00f5es] Essa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[3,6,33,280],"tags":[966,967,968,964,965,33],"class_list":["post-2325","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-casos-do-dia-a-dia","category-sql-server","category-virtual-pass-br","tag-cost-threshold-for-parallelism","tag-execution-plan","tag-execution-plan-errado","tag-paralelismo","tag-paralelismo-sql-server","tag-sql-server"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":10166,"url":"https:\/\/fabriciolima.net\/blog\/2019\/01\/30\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-8\/","url_meta":{"origin":2325,"position":0},"title":"Melhorando a Performance de Consultas no Totvs Protheus \u2013 Parte 8","author":"Fabr\u00edcio Lima","date":"30 de janeiro de 2019","format":false,"excerpt":"Fala Pessoal, Estamos de volta com novos epis\u00f3dios da s\u00e9rie de an\u00e1lise de queries de ambientes Totvs Protheus. Antes de lerem esse post, caso ainda n\u00e3o tenham lido os anteriores, sugiro que fa\u00e7am: https:\/\/www.fabriciolima.net\/blog\/2017\/12\/11\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-1\/ https:\/\/www.fabriciolima.net\/blog\/2017\/12\/18\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-2\/ https:\/\/www.fabriciolima.net\/blog\/2018\/01\/08\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-3\/ https:\/\/www.fabriciolima.net\/blog\/2018\/01\/16\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4\/ https:\/\/www.fabriciolima.net\/blog\/2018\/01\/23\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-5\/ https:\/\/www.fabriciolima.net\/blog\/2018\/01\/30\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-6\/ https:\/\/www.fabriciolima.net\/blog\/2018\/02\/07\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-7\/ No post de hoje vamos analisar esse pequeno monstro que\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/POST_PROTHEUS_8.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":268,"url":"https:\/\/fabriciolima.net\/blog\/2011\/01\/17\/querys-do-dia-a-dia-como-encontrar-um-texto-em-functions-views-e-procedures\/","url_meta":{"origin":2325,"position":1},"title":"Querys do Dia a Dia &#8211; Como encontrar um texto em Functions, Views e Procedures","author":"Fabr\u00edcio Lima","date":"17 de janeiro de 2011","format":false,"excerpt":"Fala Pessoal, Antes de incluir\/excluir\/alterar um campo de uma tabela ou antes de incluir\/excluir\/alterar uma procedure, function ou view se faz necess\u00e1rio procurar no script do banco de dados se esses objetos que ser\u00e3o alterados s\u00e3o utilizados\u00a0por alguma fun\u00e7\u00e3o, view ou SP. Constantemente eu preciso realizar esse tipo de opera\u00e7\u00e3o.\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":7342,"url":"https:\/\/fabriciolima.net\/blog\/2017\/02\/08\/improve-the-query-performance-with-like-string-changing-only-the-collation\/","url_meta":{"origin":2325,"position":2},"title":"Improve the performance of a query that uses &#8221; like &#8216;%String%&#8217; &#8221; changing only the collation","author":"Fabr\u00edcio Lima","date":"8 de fevereiro de 2017","format":false,"excerpt":"Hi Folks, In this blog post, I will give you a very useful tip to improve the performance of a query that uses \" like '%String%' \". How often do you have to use a query like this? Select Columns,... from Table where Name like '%String%' Reading the great book\u2026","rel":"","context":"Em &quot;SQL Server&quot;","block_context":{"text":"SQL Server","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/02\/PostCollationTable.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":407,"url":"https:\/\/fabriciolima.net\/blog\/2011\/02\/07\/querys-do-dia-a-dia-como-visualizar-as-colunas-include-de-um-indice\/","url_meta":{"origin":2325,"position":3},"title":"Querys do Dia a Dia: Como visualizar as colunas INCLUDE de um \u00cdndice","author":"Fabr\u00edcio Lima","date":"7 de fevereiro de 2011","format":false,"excerpt":"Fala Pessoal, Diariamente preciso\u00a0visualizar todos os \u00edndices de uma tabela para analisar a cria\u00e7\u00e3o, altera\u00e7\u00e3o ou exclus\u00e3o de um \u00edndice. A forma mais r\u00e1pida de ver os \u00edndices de uma tabela espec\u00edfica \u00e9 selecionar o nome da tabela e apertar Alt+f1. Entretanto, essa maneira n\u00e3o nos mostra as colunas da\u2026","rel":"","context":"Em &quot;Querys do Dia a Dia&quot;","block_context":{"text":"Querys do Dia a Dia","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/querys-do-dia-a-dia\/"},"img":{"alt_text":"Procedure sp_helpindex2","src":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2011\/02\/sp_helpindex2-300x84.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":285,"url":"https:\/\/fabriciolima.net\/blog\/2010\/03\/24\/criando-um-checklist-automatico-do-banco-de-dados\/","url_meta":{"origin":2325,"position":4},"title":"Criando um CheckList Autom\u00e1tico do Banco de Dados","author":"Fabr\u00edcio Lima","date":"24 de mar\u00e7o de 2010","format":false,"excerpt":"Atualizado em: 01\/05\/2017 OBS: Segue abaixo o link de um Post com uma nova vers\u00e3o desse CheckList muito mais pr\u00e1tica e com diversas melhorias. Desta vez, o CheckList ser\u00e1 enviado por e-mail em formato HTML: Link Post: Criando um E-mail de CheckList Di\u00e1rio no SQL Server \u00a0 Ol\u00e1 pessoal, Assim\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":10154,"url":"https:\/\/fabriciolima.net\/blog\/2019\/02\/19\/melhorando-a-performance-de-consultas-no-totvs-rm-apos-uma-migracao-para-o-sql-server-2016\/","url_meta":{"origin":2325,"position":5},"title":"Melhorando a performance de consultas no TOTVS RM ap\u00f3s uma migra\u00e7\u00e3o para o SQL Server 2016","author":"Fabr\u00edcio Lima","date":"19 de fevereiro de 2019","format":false,"excerpt":"Fala Pessoal, Hoje vou compartilhar para voc\u00eas um caso real e interessante que passamos ao migrar um banco de dados TOTVS RM do SQL Server 2008 para o SQL Server 2016. Fizemos a migra\u00e7\u00e3o e, como j\u00e1 estamos acostumados, algumas consultas passaram a ficar lentas ap\u00f3s a migra\u00e7\u00e3o, mesmo sem\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/post_RM_2.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/post_RM_2.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/post_RM_2.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/01\/post_RM_2.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=2325"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2325\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=2325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=2325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=2325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}