{"id":8521,"date":"2018-01-23T10:05:46","date_gmt":"2018-01-23T12:05:46","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=8521"},"modified":"2020-10-10T14:30:27","modified_gmt":"2020-10-10T17:30:27","slug":"melhorando-a-performance-de-consultas-no-totvs-protheus-parte-5","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2018\/01\/23\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-5\/","title":{"rendered":"Melhorando a Performance de Consultas no Totvs Protheus &#8211; Parte 5"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8708 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1.png\" alt=\"\" width=\"649\" height=\"392\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1.png 1200w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-300x181.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-1024x619.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-768x464.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-700x423.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-410x248.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-100x60.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-275x166.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix5-1-20x12.png 20w\" sizes=\"auto, (max-width: 649px) 100vw, 649px\" \/><\/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<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\">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\">https:\/\/www.fabriciolima.net\/blog\/2018\/01\/16\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4\/<\/a><\/li>\n<\/ul>\n<p>Hoje vamos analisar a query abaixo que estava demorando<strong> 28 segundos<\/strong> em um cliente e foi executada mais de <strong>100 vezes<\/strong> em um dia:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT B1_DESC ,\r\n       B1_COD ,\r\n       ISNULL(ZY_TIPO, '') TIPO\r\nFROM   SB1010\r\n       LEFT JOIN SZY010 ON B1_COD = ZY_COD\r\n                           AND SZY010.D_E_L_E_T_ = ''\r\n                           AND ZY_DTDESAT = ''\r\nWHERE  SB1010.D_E_L_E_T_ = ''\r\n       AND B1_MSBLQL &lt;&gt; '1'\r\n       AND B1_DESC LIKE '%NOMEPRODUTO%'\r\n       AND B1_DESC LIKE '%%'\r\n       AND B1_COD IN (   SELECT AIB_CODPRO\r\n                         FROM   AIB010\r\n                         WHERE  D_E_L_E_T_ = ''\r\n                                AND AIB_DATVIG &gt;= '20171215'\r\n                                AND AIB_CODFOR = '001234'\r\n                                AND AIB_CODTAB = '009'\r\n                     );<\/pre>\n<p>Plano:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8523 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1.png\" alt=\"\" width=\"597\" height=\"292\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1.png 1018w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-300x147.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-768x376.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-700x342.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-410x201.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-100x49.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-275x135.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_1-20x10.png 20w\" sizes=\"auto, (max-width: 597px) 100vw, 597px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Mais uma vez o SQL nos sugere um \u00edndice:<\/p>\n<pre class=\"lang:tsql decode:true\">CREATE NONCLUSTERED INDEX SZY010W01\r\nON [dbo].[SZY010] ([ZY_DTDESAT],[D_E_L_E_T_])\r\nINCLUDE ([ZY_COD],[ZY_TIPO])\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>Digo e repito: Missing Index ajuda, mas nem sempre \u00e9 a melhor solu\u00e7\u00e3o.<\/p>\n<p>Olha como essas duas colunas s\u00e3o usadas na query:<\/p>\n<p><strong><em>AND SZY010.D_E_L_E_T_ = &#8221; AND ZY_DTDESAT = &#8221;<\/em><\/strong><\/p>\n<p><strong>Nada seletivo!<\/strong> N\u00e3o seria uma boa coluna para um \u00edndice (exceto exce\u00e7\u00f5es).<\/p>\n<p>Podemos ver facilmente que a query tem uma subquery. Se rodarmos essa subquery separada temos esse plano:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8526 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2.png\" alt=\"\" width=\"761\" height=\"334\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2.png 921w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-300x132.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-768x337.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-700x307.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-410x180.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-100x44.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-275x121.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_2-20x9.png 20w\" sizes=\"auto, (max-width: 761px) 100vw, 761px\" \/><\/p>\n<p>O SQL nos sugere outro \u00edndice que n\u00e3o seria o melhor a ser criado:<\/p>\n<pre class=\"lang:tsql decode:true \">CREATE NONCLUSTERED INDEX [&lt;Name of Missing Index, sysname,&gt;]\r\nON [dbo].[AIB010] ([AIB_CODTAB],[D_E_L_E_T_],[AIB_CODFOR],[AIB_DATVIG])\r\n<\/pre>\n<p>Ele sugere come\u00e7ar esse \u00edndice pela coluna <strong>AIB_CODTAB<\/strong>, mas ser\u00e1 que ela \u00e9 a mais seletiva dessa query?<\/p>\n<p><strong>Como sei qual \u00e9 a coluna mais seletiva da query Fabricio?<\/strong><\/p>\n<p>Fa\u00e7a um count distinct nas colunas que quer validar:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-8525 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3.png\" alt=\"\" width=\"542\" height=\"154\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3.png 542w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3-300x85.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3-410x116.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3-100x28.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3-275x78.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_3-20x6.png 20w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>No nosso caso, a coluna <strong>AIB_CODFOR<\/strong> \u00e9 muito melhor para ter um \u00edndice do que a coluna <strong>AIB_CODTAB<\/strong>, pois ela tem muito mais valores distintos. \u00c9 uma coluna mais seletiva e um \u00edndice por ela deve beneficiar outras queries que acessam essa tabela.<\/p>\n<p>Tudo isso at\u00e9 agora foi para mostrar que missed index ajuda, mas n\u00e3o \u00e9 regra.<\/p>\n<p><strong>O que voc\u00ea faria para melhorar essa query ent\u00e3o Fabr\u00edcio?<\/strong><\/p>\n<p>Vou tentar induzir o SQL a rodar essa query da forma abaixo:<\/p>\n<ol>\n<li>Executar a subquery pois ela retorna s\u00f3 200 linhas.<\/li>\n<li>Fazer a busca na tabela <strong>SB1<\/strong> por ( <strong>B1_COD<\/strong> IN\u00a0 ), por ser uma coluna bem seletiva.<\/li>\n<li>Chegar at\u00e9 a tabela <strong>SZY010<\/strong> pelo c\u00f3digo com essa compara\u00e7\u00e3o (<strong>B1_COD = ZY_COD<\/strong>).<\/li>\n<\/ol>\n<p><strong>Como voc\u00ea consegue fazer isso Fabr\u00edcio? Tem algum bot\u00e3o que voc\u00ea clica e escolhe os passos?<\/strong><\/p>\n<p>R: Ainda n\u00e3o tem bot\u00e3o. Ainda&#8230; Enquanto isso, conseguimos fazer criando \u00edndices manualmente!!!<\/p>\n<pre class=\"lang:tsql decode:true \">CREATE NONCLUSTERED INDEX AIB010W01\r\nON [dbo].[AIB010] ([AIB_CODFOR],[AIB_CODTAB],[AIB_DATVIG],[D_E_L_E_T_])\r\ninclude(AIB_CODPRO)\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)\r\n\r\nCREATE NONCLUSTERED INDEX SB1010W01\r\nON [dbo].[SB1010] (B1_COD,B1_DESC,B1_MSBLQL,D_E_L_E_T_)\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)\r\n\r\nCREATE NONCLUSTERED INDEX SZY010W01\r\nON [dbo].[SZY010] ([ZY_COD],[ZY_DTDESAT],[D_E_L_E_T_])\r\nINCLUDE([ZY_TIPO])\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>Ap\u00f3s criar esses 3 \u00edndices que s\u00e3o bem pequenos, olhem como ficou o plano da query:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8528 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4.png\" alt=\"\" width=\"758\" height=\"221\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4.png 1018w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-300x88.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-768x224.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-700x204.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-410x120.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-100x29.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-275x80.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_4-20x6.png 20w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>O SQL fez exatamente o que induzi ele a fazer. Pegou dados da subquery, buscou os c\u00f3digos retornados por ela na <strong>SB1<\/strong> e depois chegou na <strong>SZY<\/strong> pelo <strong>COD<\/strong> tamb\u00e9m.<\/p>\n<p><strong>E o tempo de 28 segundos Fabr\u00edcio, foi para quanto?<\/strong><\/p>\n<p>WOW!!!!! Agora a query roda instant\u00e2nea.<\/p>\n<p>Consumo antes:<\/p>\n<pre class=\"lang:tsql decode:true\">Table 'SZY010'. Scan count 1, logical reads 187725\r\nTable 'AIB010'. Scan count 1, logical reads 2732873\r\nTable 'SB1010'. Scan count 1, logical reads 4271\r\n\r\n SQL Server Execution Times:\r\n   CPU time = 28438 ms,  elapsed time = 28673 ms.<\/pre>\n<p>&nbsp;<\/p>\n<p>Consumo Depois:<\/p>\n<pre class=\"lang:tsql decode:true\">Table 'SZY010'. Scan count 15, logical reads 30\r\nTable 'SB1010'. Scan count 223, logical reads 673\r\nTable 'AIB010'. Scan count 1, logical reads 5\r\n\r\n SQL Server Execution Times:\r\n   CPU time = 0 ms,  elapsed time = 43 ms.<\/pre>\n<p>Redu\u00e7\u00e3o absurda com \u00edndices pequenos. Bem simples e eficiente&#8230;.<\/p>\n<p>Olhando no <strong>Trace<\/strong> de queries demoradas, a query ficou t\u00e3o r\u00e1pida que tenho que apelar e colocar um <strong>waitfor delay<\/strong> para poder visualizar e comparar:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8529 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5.png\" alt=\"\" width=\"880\" height=\"171\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5.png 1009w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-300x58.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-768x149.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-700x136.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-410x80.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-100x19.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-275x53.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte5_5-20x4.png 20w\" sizes=\"auto, (max-width: 880px) 100vw, 880px\" \/><\/p>\n<p>Ela rodou em <strong>0,1 segundos<\/strong> e a diferen\u00e7a de leituras de p\u00e1ginas<strong> (2.9 milh\u00f5es para 802)<\/strong> e do consumo de CPU<strong> (27 mil para 62)<\/strong> \u00e9 gigante!!!<\/p>\n<p>Baita diferen\u00e7a.<\/p>\n<p>\u00c9 isso ai pessoal, melhoramos mais uma query no Protheus.<\/p>\n<p>At\u00e9 a pr\u00f3xima an\u00e1lise de query.<\/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>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\/ 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\/ Hoje vamos analisar a query abaixo que estava demorando 28 segundos em um cliente e foi executada mais de 100 vezes em um dia: SELECT B1_DESC , B1_COD [&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,1248,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-8521","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-consultoria-sql-server","category-dba-remoto","category-queries-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\/8521","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=8521"}],"version-history":[{"count":11,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8521\/revisions"}],"predecessor-version":[{"id":13841,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8521\/revisions\/13841"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=8521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=8521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=8521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}