{"id":10318,"date":"2021-01-07T19:17:01","date_gmt":"2021-01-07T22:17:01","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=10318"},"modified":"2021-01-07T19:22:28","modified_gmt":"2021-01-07T22:22:28","slug":"melhorando-a-performance-de-consultas-no-totvs-protheus-parte-9","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2021\/01\/07\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-9\/","title":{"rendered":"Melhorando a Performance de Consultas no Totvs Protheus \u2013 Parte 9"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10319 aligncenter\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09.png\" alt=\"\" width=\"605\" height=\"366\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09.png 1118w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-300x181.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-1024x619.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-768x464.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-700x423.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-410x248.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-100x60.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-275x166.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09-20x12.png 20w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Fala Pessoal,<\/p>\n<p>Esse post est\u00e1 h\u00e1 tanto tempo no rascunho do meu Blog que at\u00e9 o nome da empresa na foto est\u00e1 antigo. Vou manter assim mesmo.<\/p>\n<p>&nbsp;<\/p>\n<p>Estamos de volta com mais um epis\u00f3dio da s\u00e9rie de an\u00e1lise de queries de ambientes Totvs Protheus.<\/p>\n<p>Antes de lerem esse post, caso ainda n\u00e3o tenham lido os anteriores, sugiro que fa\u00e7am:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2017\/12\/11\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-1\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2017\/12\/11\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-1\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2017\/12\/18\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-2\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2017\/12\/18\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-2\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/01\/08\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-3\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2018\/01\/08\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-3\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/01\/16\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2018\/01\/16\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/01\/23\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-5\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2018\/01\/23\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-5\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/01\/30\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-6\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2018\/01\/30\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-6\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/02\/07\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-7\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-wpel-link=\"internal\">https:\/\/www.fabriciolima.net\/blog\/2018\/02\/07\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-7\/<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2019\/01\/30\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-8\/\" target=\"_blank\" rel=\"noopener noreferrer\">Melhorando a Performance de Consultas no Totvs Protheus \u2013 Parte 8<\/a><\/li>\n<\/ul>\n<p>Nesse post vamos analisar uma query com c\u00f3digo simples, mas que foi executada mais de 13 mil vezes em 5 dias em um cliente.<\/p>\n<p>Ela tamb\u00e9m retornava 27 milh\u00f5es de linhas para a aplica\u00e7\u00e3o (tamanho da tabela). Esse tipo de query \u00e9 bem comum no Protheus:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT R_E_C_N_O_ FROM dbo.CTK010 WHERE D_E_L_E_T_ = ' ' ORDER BY CTK_FILIAL,CTK_SEQUEN,R_E_C_N_O_\r\n<\/pre>\n<p>Olhando o plano dela, da para ver que o maior custo da query \u00e9 o Sort :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10322 aligncenter\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2.png\" alt=\"\" width=\"1175\" height=\"103\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2.png 1445w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-300x26.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-1024x90.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-768x67.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-700x62.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-410x36.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-100x9.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-275x24.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_2-20x2.png 20w\" sizes=\"auto, (max-width: 1175px) 100vw, 1175px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Nesse caso o Sort \u00e9 devido ao order by da query:<\/p>\n<pre class=\"lang:tsql decode:true\">ORDER BY CTK_FILIAL,CTK_SEQUEN,R_E_C_N_O_<\/pre>\n<p>Colunas chaves do \u00edndice utilizado: D_E_L_E_T_, CTK_FILIAL<\/p>\n<p>Colunas no include: CTK_SEQUEN, R_E_C_N_O_<\/p>\n<p>O INCLUDE n\u00e3o tem as colunas ordenadas. Assim, o SQL, depois de fazer um seek no \u00edndice, ainda tem que ordenar o resultado e isso \u00e9 muito custoso para 27 milh\u00f5es de linhas.<\/p>\n<p>E se eu colocar todas essas colunas no \u00edndice para que fiquem ordenadas???<\/p>\n<p>Vamos tentar:<\/p>\n<pre class=\"lang:tsql decode:true\">create nonclustered index CTK010W01 on CTK010(D_E_L_E_T_, CTK_FILIAL,CTK_SEQUEN, R_E_C_N_O_)\r\nwith(FILLFACTOR=90)\r\n<\/pre>\n<p>Olha como ficaram os planos das queries com o \u00edndice antigo e o \u00edndice novo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10321\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1.png\" alt=\"\" width=\"870\" height=\"234\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1.png 1450w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-300x81.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-1024x275.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-768x207.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-700x188.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-410x110.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-100x27.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-275x74.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2019\/02\/Totvs_Protheus_E09_1-20x5.png 20w\" sizes=\"auto, (max-width: 870px) 100vw, 870px\" \/><\/p>\n<p>Deu certo. A opera\u00e7\u00e3o de SORT morreu.<\/p>\n<p>Segue abaixo o consumo de CPU antes e depois:<\/p>\n<pre class=\"lang:tsql decode:true\">Antes:\r\n SQL Server Execution Times:\r\n   CPU time = 171163 ms,  elapsed time = 73272 ms.\r\n   \r\nDepois:\r\n SQL Server Execution Times:\r\n   CPU time = 10873 ms,  elapsed time = 11414 ms.<\/pre>\n<p>O SQL gastava 171 segundos nos cores de CPU processando essa query e agora com esse novo \u00edndice fica apenas 10 segundos.<\/p>\n<p>Agora imagina isso sendo executado 2.500 vezes por dia?<\/p>\n<p><strong>De nada em CPU!!! =)<\/strong><\/p>\n<p>Claro que o cliente vai validar o motivo dessa execu\u00e7\u00e3o com essa frequ\u00eancia toda, mas at\u00e9 ele descobrir e solucionar, a CPU j\u00e1 me mandou um obrigado e pagou meu almo\u00e7o, porque ela vai trabalhar muito menos.<\/p>\n<p>Gostou dessa dica?<\/p>\n<p>Publiquei um curso com 11 horas de dura\u00e7\u00e3o que tem mais 9 queries como essa sendo analisadas e muito mais dicas de performance:<\/p>\n<p>Curso:\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/cursos.powertuning.com.br\/course?courseid=melhorando-a-performance-de-consultas-no-totvs-protheus\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">Melhorando a Performance de Consultas no Totvs Protheus<\/a><\/p>\n<p>Tamb\u00e9m gravei uma aula gr\u00e1tis com 60 minutos de dura\u00e7\u00e3o sobre o que voc\u00ea deve aprender para melhorar a performance no Protheus:<\/p>\n<div class=\"fluid-width-video-wrapper\"><a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s\" target=\"_blank\" rel=\"noopener noreferrer external nofollow\" data-wpel-link=\"external\">https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s<\/a><\/div>\n<header><\/header>\n<header><\/header>\n<header><b>Gostou desse Post?<\/b><\/header>\n<p>Curta, comente, compartilhe\u2026<\/p>\n<p>Curta nossa p\u00e1gina no\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.facebook.com\/SouPowerTuning\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">Facebook<\/a>\u00a0,\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.linkedin.com\/company\/sou-powertuning\" target=\"_blank\" rel=\"noopener external noreferrer nofollow\" data-wpel-link=\"external\">LinkedIn<\/a>\u00a0e\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.instagram.com\/soupowertuning\/\" target=\"_blank\" rel=\"noopener external noreferrer nofollow\" data-wpel-link=\"external\">Instagram<\/a>\u00a0para receber Dicas de Leituras, V\u00eddeos e Eventos sobre SQL Server.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima.<\/p>\n<p>Microsoft Data Platform MVP<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Fala Pessoal, Esse post est\u00e1 h\u00e1 tanto tempo no rascunho do meu Blog que at\u00e9 o nome da empresa na foto est\u00e1 antigo. Vou manter assim mesmo. &nbsp; Estamos de volta com mais um epis\u00f3dio da s\u00e9rie de an\u00e1lise de queries de ambientes Totvs Protheus. Antes de lerem esse post, caso ainda n\u00e3o tenham [&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":""},"categories":[3,6,942,991,33,280],"tags":[1691,1031,1032,1097,1096,1044,1102,1054,1029,1030,1088,1089,1045,1033,1597,1676,1040,1598,1694,1519,63,1035,1042,1046,1021,1020,1039,1535,1041,1052,33,1521,1057,1015,1055,1050,1043,1391,40],"class_list":["post-10318","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-casos-do-dia-a-dia","category-consultoria-sql-server","category-dba-remoto","category-sql-server","category-virtual-pass-br","tag-alwaystuningyourdata","tag-banco-protheus","tag-banco-totvs","tag-consultor-protheus","tag-consultor-totvs","tag-consultoria-protheus","tag-consultoria-totvs","tag-datasul-totvs","tag-dba-protheus","tag-dba-totvs","tag-dica-banco-de-dados-protheus","tag-dicas-banco-de-dados-protheus","tag-erp-protheus","tag-lentidao-protheus","tag-lentidao-protheus-12","tag-lentidao-totvs","tag-microsiga-protheus","tag-migracao-protheus-12","tag-migracao-rm","tag-migracao-totvs","tag-performance","tag-performance-protheus","tag-protheus","tag-protheus-microsiga","tag-protheus-microsoft-sql-server","tag-protheus-sql-server","tag-protheus-totvs","tag-rm-totvs","tag-sistema-protheus","tag-sistema-rm-totvs","tag-sql-server","tag-sql-server-protheus","tag-suporte-totvs","tag-totvs","tag-totvs-datasul","tag-totvs-microsiga","tag-totvs-protheus","tag-totvs-sql-server","tag-tuning"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/10318","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=10318"}],"version-history":[{"count":7,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/10318\/revisions"}],"predecessor-version":[{"id":14795,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/10318\/revisions\/14795"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=10318"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=10318"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=10318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}