{"id":8459,"date":"2018-01-08T22:58:36","date_gmt":"2018-01-09T00:58:36","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=8459"},"modified":"2020-10-10T14:32:33","modified_gmt":"2020-10-10T17:32:33","slug":"melhorando-a-performance-de-consultas-no-totvs-protheus-parte-3","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2018\/01\/08\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-3\/","title":{"rendered":"Melhorando a Performance de Consultas no Totvs Protheus &#8211; Parte 3"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8676 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3.png\" alt=\"\" width=\"608\" height=\"368\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3.png 1117w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-300x181.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-1024x619.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-768x464.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-700x423.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-410x248.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-100x60.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-275x166.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/NetFlix3-20x12.png 20w\" sizes=\"auto, (max-width: 608px) 100vw, 608px\" \/><\/p>\n<p>Fala pessoal,<\/p>\n<p>Antes de lerem esse post, caso ainda n\u00e3o tenham lido os anteriores, sugiro que fa\u00e7am para seguirem a linha de racioc\u00ednio:<\/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\">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\">https:\/\/www.fabriciolima.net\/blog\/2017\/12\/18\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-2\/<\/a><\/li>\n<\/ul>\n<p>Pegando mais uma quey no Traces de queries demoradas. Durante a semana, essa query apareceu v\u00e1rias vezes demorando mais de <strong>3 segundos<\/strong>. Contudo, no fim de semana, ao rodar ela sem concorr\u00eancia, ela est\u00e1 instant\u00e2nea.<\/p>\n<p><strong>Nesse caso eu fa\u00e7o o que Fabricio? Ignoro?<\/strong><\/p>\n<p><strong>N\u00e3o<\/strong>. Vi que tem \u00edndices triviais nessa query que n\u00e3o existem, ent\u00e3o vamos criar para reduzir a quantidade de leituras dela:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT   C6_NUM ,\r\n         C6_QTDVEN ,\r\n         C6_NOTA ,\r\n         C6_CLI ,\r\n         C6_PRCVEN ,\r\n         C5_EMISSAO ,\r\n         C5_YSTATUS ,\r\n         C5_VEND1\r\nFROM     SC6080 SC6 ,\r\n         SC5080 SC5\r\nWHERE    C6_FILIAL = C5_FILIAL\r\n         AND C5_NUM = C6_NUM\r\n         AND C6_PRODUTO = 'BHASJHSU654556'\r\n         AND C6_FILIAL = '01'\r\n         AND SC6.D_E_L_E_T_ = ''\r\n         AND SC5.D_E_L_E_T_ = ''\r\nORDER BY C5_EMISSAO ,\r\n         C6_NUM;<\/pre>\n<p>Segue o plano dessa query:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8462 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1.png\" alt=\"\" width=\"771\" height=\"328\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1.png 1006w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-300x128.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-768x327.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-700x298.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-410x174.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-100x43.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-275x117.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_1-20x9.png 20w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/p>\n<p>O SQL Server est\u00e1 fazendo <strong>Seek+lookup<\/strong> nas duas tabelas envolvidas (<strong>SC5080<\/strong> e <strong>SC6080<\/strong>).<\/p>\n<p>Levando em conta a <strong>Parte 1<\/strong> e <strong>Parte 2<\/strong> da s\u00e9rie Fabr\u00edcio, devemos tentar criar um \u00edndice apenas em\u00a0C6_PRODUTO para ver se j\u00e1 resolve a query?<\/p>\n<p>Veja bem&#8230;.<\/p>\n<p>Vamos criar para verem o que vai acontecer.<\/p>\n<pre class=\"lang:tsql decode:true\">create nonclustered index SC6080W01 on SC6080(C6_PRODUTO)with(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>Ao criar o \u00edndice, <strong>o SQL Server n\u00e3o usou o \u00edndice<\/strong> e a query rodou com o mesmo plano de execu\u00e7\u00e3o anterior.<\/p>\n<p><strong>Oxente Fabr\u00edcio&#8230; venha c\u00e1&#8230; mas por que n\u00e3o usou? <\/strong><\/p>\n<p><em>obs.: Estou atendendo um cliente em Salvador hoje (08\/01) e peguei o sotaque.<\/em><\/p>\n<p>R: Porque essa query retorna mais de 2 mil linhas no resultado.<\/p>\n<p><strong>Gravem isso que \u00e9 muito importante<\/strong>: <em>Fazer um lookup em poucas linhas \u00e9 tranquilo, agora fazer um <strong>lookup<\/strong> em muitas linhas \u00e9 custoso e esse \u00e9 o motivo do SQL n\u00e3o querer usar o nosso \u00edndice por essa coluna \u00fanica.<\/em><\/p>\n<p>Como essa tabela n\u00e3o \u00e9 t\u00e3o grande e esse \u00edndice em produto tem tudo para ser bom por ser uma coluna bem seletiva, vamos criar um <strong>covered index<\/strong> (\u00edndice com todas as colunas necess\u00e1rias para executar essa query).<\/p>\n<pre class=\"lang:tsql decode:true\">create nonclustered index SC6080W01 on SC6080\r\n(C6_PRODUTO,C6_NUM,C6_FILIAL,D_E_L_E_T_ ) include(C6_NOTA,C6_CLI,C6_QTDVEN,C6_PRCVEN)\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>A quantidade de leituras na tabela <strong>SC6080<\/strong> j\u00e1 reduziu para <strong>15 reads<\/strong> e a query ficou com esse plano:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-8463 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2.png\" alt=\"\" width=\"792\" height=\"294\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2.png 792w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-300x111.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-768x285.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-700x260.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-410x152.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-100x37.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-275x102.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_2-20x7.png 20w\" sizes=\"auto, (max-width: 792px) 100vw, 792px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Olhando os \u00edndices da tabela <strong>SC5080<\/strong>, j\u00e1 existe um \u00edndice na coluna <strong>C5_NUM<\/strong> criado por mim para alguma outra query nesse cliente, contudo esse \u00edndice s\u00f3 possui 4 colunas:<\/p>\n<pre class=\"lang:tsql decode:true \">C5_NUM, C5_FILIAL, C5_TIPO, D_E_L_E_T_<\/pre>\n<p>Como esse \u00edndice n\u00e3o tem todas as colunas que a query precisa, o SQL n\u00e3o est\u00e1 usando.<\/p>\n<p>Vamos adicionar todas as colunas da tabela <strong>SC5<\/strong> utilizada pela query para ver se agora o SQL vai usar meu \u00edndice:<\/p>\n<pre class=\"lang:tsql decode:true \">create nonclustered index SC5080W01 on SC5080\r\n(C5_NUM, C5_FILIAL, C5_TIPO, D_E_L_E_T_,C5_EMISSAO) include(C5_YSTATUS,C5_VEND1)\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>Agora sim o SQL passou a usar os meus 2 \u00edndices para essa query:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-8464 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3.png\" alt=\"\" width=\"592\" height=\"222\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3.png 592w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3-300x113.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3-410x154.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3-100x38.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3-275x103.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte3_3-20x8.png 20w\" sizes=\"auto, (max-width: 592px) 100vw, 592px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Segue a diferen\u00e7a de leituras com a cria\u00e7\u00e3o dos \u00edndices:<\/p>\n<pre class=\"lang:tsql decode:true \">-- Antes dos \u00edndices\r\nTable 'SC5080'. Scan count 2319, logical reads 14538\r\nTable 'SC6080'. Scan count 1, logical reads 7121\r\n\r\n--Depois dos \u00edndices\r\nTable 'SC5080'. Scan count 2319, logical reads 7423\r\nTable 'SC6080'. Scan count 1, logical reads 15<\/pre>\n<p>Tabela <strong>SC5080<\/strong> rediziu <strong>7 mil reads<\/strong> e a tabela <strong>SC6080<\/strong> reduziu mais <strong>7 mil reads<\/strong>.<\/p>\n<p>N\u00e3o foi um ganho t\u00e3o grande quanto nos 2 casos anteriores, mas como s\u00e3o \u00edndices bons (<strong>PRODUTO<\/strong> e <strong>NUM<\/strong>), certamente esses \u00edndices devem ser utilizados para outras queries.<\/p>\n<p><strong>Lembrem disso:<\/strong> <em>Um \u00edndice por uma coluna boa, n\u00e3o vai ser utilizado s\u00f3 pela query que voc\u00ea est\u00e1 analisando, certamente ser\u00e1 utilizado por outras queries do sistema.<\/em><\/p>\n<p>\u00c9 isso ai pessoal, melhoramos mais uma query no Protheus.<\/p>\n<p>At\u00e9 a pr\u00f3xima an\u00e1lise.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\"><strong>Atualizado no dia 07\/10\/2020:<\/strong><\/span><\/p>\n<p>Publiquei um curso com 11 horas de dura\u00e7\u00e3o com toda minha experi\u00eancia de anos no assunto e de dezenas de clientes Protheus atendidos:<\/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=\"nofollow external noopener noreferrer\" data-wpel-link=\"external\">Melhorando a Performance de Consultas no Totvs Protheus<\/a><\/p>\n<p>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 href=\"https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s<\/a><\/div>\n<div><\/div>\n<div><\/div>\n<p><b>Gostou desse Post?<\/b><\/p>\n<p>Curta, comente, compartilhe com os coleguinhas\u2026<\/p>\n<p>Assine meu canal no\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.youtube.com\/channel\/UCeBRAO_LLrUdSrOXIywjzRA\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">Youtube<\/a>\u00a0e curta minha\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">P\u00e1gina no Facebook<\/a>\u00a0para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>At\u00e9 a pr\u00f3xima.<\/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>Fala pessoal, Antes de lerem esse post, caso ainda n\u00e3o tenham lido os anteriores, sugiro que fa\u00e7am para seguirem a linha de racioc\u00ednio: 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\/ Pegando mais uma quey no Traces de queries demoradas. Durante a semana, essa query apareceu v\u00e1rias vezes demorando mais de 3 segundos. Contudo, no fim de semana, ao rodar ela [&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,942,991,13,33,280],"tags":[15,1031,1032,1101,1099,1100,1097,1098,1096,1048,1044,1103,942,1102,1595,1054,23,1029,1030,1088,1089,1025,1026,1049,1045,110,1034,1033,1597,1016,1040,1019,1598,1035,1042,1023,1024,1596,1046,1021,1020,1039,1053,1022,1018,1059,1047,1041,1036,1052,1060,1038,1051,33,1057,1017,1015,1055,1050,1043],"class_list":["post-8459","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-consultoria-sql-server","category-dba-remoto","category-querys-do-dia-a-dia","category-sql-server","category-virtual-pass-br","tag-banco-de-dados","tag-banco-protheus","tag-banco-totvs","tag-consultor-crm","tag-consultor-datasul","tag-consultor-microsiga","tag-consultor-protheus","tag-consultor-rm","tag-consultor-totvs","tag-consultoria-microsiga","tag-consultoria-protheus","tag-consultoria-rm","tag-consultoria-sql-server","tag-consultoria-totvs","tag-crm-datasul-datasul-erp","tag-datasul-totvs","tag-dba","tag-dba-protheus","tag-dba-totvs","tag-dica-banco-de-dados-protheus","tag-dicas-banco-de-dados-protheus","tag-erp","tag-erp-com-sql-server","tag-erp-microsiga","tag-erp-protheus","tag-indice","tag-lentidao-banco-de-dados","tag-lentidao-protheus","tag-lentidao-protheus-12","tag-microsiga","tag-microsiga-protheus","tag-microsiga-sql-server","tag-migracao-protheus-12","tag-performance-protheus","tag-protheus","tag-protheus-10","tag-protheus-11","tag-protheus-12","tag-protheus-microsiga","tag-protheus-microsoft-sql-server","tag-protheus-sql-server","tag-protheus-totvs","tag-rm-sistemas","tag-rm-sql-server","tag-siga","tag-sistema-crm","tag-sistema-microsiga","tag-sistema-protheus","tag-sistema-rm","tag-sistema-rm-totvs","tag-sistema-wms","tag-sistemas-de-gestao","tag-sistemas-erp","tag-sql-server","tag-suporte-totvs","tag-top-connect","tag-totvs","tag-totvs-datasul","tag-totvs-microsiga","tag-totvs-protheus"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8459","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=8459"}],"version-history":[{"count":8,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8459\/revisions"}],"predecessor-version":[{"id":13843,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8459\/revisions\/13843"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=8459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=8459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=8459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}