{"id":8467,"date":"2018-01-16T09:40:35","date_gmt":"2018-01-16T11:40:35","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=8467"},"modified":"2020-10-10T14:32:25","modified_gmt":"2020-10-10T17:32:25","slug":"melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2018\/01\/16\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-4\/","title":{"rendered":"Melhorando a Performance de Consultas no Totvs Protheus &#8211; Parte 4"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8696 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4.png\" alt=\"\" width=\"677\" height=\"411\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4.png 1183w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-300x182.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-1024x621.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-768x466.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-700x425.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-410x249.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-100x61.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-275x167.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/01\/Netflix4-20x12.png 20w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/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<\/ul>\n<p>Pegando mais uma query no Traces de queries demoradas. Essa query est\u00e1 demorando <strong>18 segundos<\/strong> e fazendo um n\u00famero absurdo de leituras na tabela <strong>SF2090<\/strong>.<\/p>\n<p>Query:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT   A1_COD ,\r\n         A1_LOJA ,\r\n         A1_NOME ,\r\n         F2_DOC ,\r\n         F2_SERIE ,\r\n         CONVERT(DATE, F2_EMISSAO) AS F2_EMISSAO ,\r\n         ZZB_VOLUME ,\r\n         SA4.A4_COD ,\r\n         SA4.A4_NOME ,\r\n         SA1.A1_END ,\r\n         SA1.A1_COMPLEM ,\r\n         SA1.A1_BAIRRO ,\r\n         SA1.A1_EST ,\r\n         SA1.A1_MUN ,\r\n         SA1.A1_CEP ,\r\n         A1_CGC ,\r\n         SA1.A1_TEL ,\r\n         SA1.A1_DDD ,\r\n         A1_EMAIL ,\r\n         ZZB.ZZB_RASTRO ,\r\n         A4_YSERVIC ,\r\n         SF2.F2_VALBRUT ,\r\n         SF2.F2_VOLUME1 ,\r\n         VT1_API ,\r\n         VT1_ORDID ,\r\n         VT1_SEQUEN ,\r\n         F2_PBRUTO * 1000 F2_PBRUTO\r\nFROM     SF2090 SF2\r\n         JOIN SA1040 SA1 ON A1_FILIAL = '  '\r\n                            AND SA1.D_E_L_E_T_ = ' '\r\n                            AND SA1.A1_COD = SF2.F2_CLIENTE\r\n                            AND SA1.A1_LOJA = SF2.F2_LOJA\r\n         JOIN SA4090 SA4 ON A4_FILIAL = '  '\r\n                            AND SA4.D_E_L_E_T_ = ' '\r\n                            AND SA4.A4_COD = SF2.F2_TRANSP\r\n         JOIN ZZB090 ZZB ON ZZB_FILIAL = '01'\r\n                            AND ZZB.D_E_L_E_T_ = ' '\r\n                            AND ZZB.ZZB_DOC = SF2.F2_DOC\r\n                            AND ZZB.ZZB_SERIE = SF2.F2_SERIE\r\n         JOIN SC5090 SC5 ON C5_FILIAL = '01'\r\n                            AND SC5.D_E_L_E_T_ = ' '\r\n                            AND SF2.F2_DOC = SC5.C5_NOTA\r\n                            AND SF2.F2_SERIE = SC5.C5_SERIE\r\n         LEFT JOIN VT1090 VT1 ON VT1_FILIAL = '01'\r\n                                 AND VT1.D_E_L_E_T_ = ' '\r\n                                 AND SC5.C5_NUM = VT1.VT1_NUMPED\r\n         OUTER APPLY (   SELECT TOP 1 *\r\n                         FROM   VT4090 VT4\r\n                         WHERE  VT4_FILIAL = '01'\r\n                                AND VT4.D_E_L_E_T_ = ' '\r\n                                AND VT4.VT4_ORDID = VT1.VT1_ORDID\r\n                                AND VT4_EMPFOR + VT4_FILFOR = '23234'\r\n                     ) VT4\r\nWHERE    SF2.F2_FILIAL = '01'\r\n         AND SF2.D_E_L_E_T_ = ' '\r\n         AND SF2.F2_TIPO = 'N'\r\n         AND SF2.F2_EMISSAO &gt;= '20170315'\r\n         AND SF2.F2_TRANSP IN ( '34534534', '34534534', '3453454' )\r\n         AND ZZB.ZZB_PLP = ' '\r\nORDER BY ZZB.ZZB_RASTRO DESC ,\r\n         F2_DOC;<\/pre>\n<p>Leituras:<\/p>\n<pre class=\"lang:tsql decode:true\">Table 'VT1090'. Scan count 0, logical reads 0\r\nTable 'SA1040'. Scan count 0, logical reads 0\r\nTable 'SF2090'. Scan count 1168821, logical reads 3725643\r\nTable 'SC5090'. Scan count 1, logical reads 4316\r\nTable 'ZZB090'. Scan count 1, logical reads 149\r\nTable 'SA4090'. Scan count 1, logical reads 13\r\n\r\n SQL Server Execution Times:\r\n   CPU time = 15906 ms,  elapsed time = 18008 ms.<\/pre>\n<p><strong>WOW!!!\u00a0<\/strong> <strong>3,7 milh\u00f5es de leituras<\/strong> na tabela <strong>SF2<\/strong>.<\/p>\n<p>Vamos ver o que est\u00e1 acontecendo no plano de execu\u00e7\u00e3o:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-8471 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1.png\" alt=\"\" width=\"893\" height=\"330\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1.png 1131w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-300x111.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-1024x378.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-768x284.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-700x259.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-410x152.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-100x37.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-275x102.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_1-20x7.png 20w\" sizes=\"auto, (max-width: 893px) 100vw, 893px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Como o plano \u00e9 muito grande, peguei apenas a parte que envolve a tabela com mais leituras.<\/p>\n<p>O SQL Server mais uma vez sugere um \u00edndice <strong>(Tabela SC5)<\/strong> que eu vou ignorar. Sempre falo que esses \u00edndices sugeridos ajudam, mas n\u00e3o d\u00e3o sempre a melhor solu\u00e7\u00e3o para uma query. <strong>Use com modera\u00e7\u00e3o!<\/strong><\/p>\n<p>O SQL Server junta os dados das tabelas <strong>ZZB090<\/strong> e <strong>SC5090<\/strong> e s\u00f3 depois faz um <strong>Seek<\/strong> na tabela <strong>SF2090<\/strong>. S\u00f3 que ele faz isso mais de 1 milh\u00e3o de vezes devido a quantidade grande de linhas que saiu do join das duas tabelas anteriores.<\/p>\n<p><strong>Mas por que ele faz isso Fabr\u00edcio? Como podemos mudar isso?<\/strong><\/p>\n<p>Olhando apenas a cl\u00e1usula where:<\/p>\n<pre class=\"lang:tsql decode:true \">WHERE    SF2.F2_FILIAL = '01'\r\n         AND SF2.D_E_L_E_T_ = ' '\r\n         AND SF2.F2_TIPO = 'N'\r\n         AND SF2.F2_EMISSAO &gt;= '20170315'\r\n         AND SF2.F2_TRANSP IN ( '34534534', '34534534', '3453454' )\r\n         AND ZZB.ZZB_PLP = ' '<\/pre>\n<p>Eu fiz um count com esse where e retornava apenas <strong>6 mil linhas.<\/strong><\/p>\n<p>Se tiv\u00e9ssemos um <strong>covered index<\/strong> (com todas as colunas da tabela que foram usadas na query) e come\u00e7ando com <strong>F2_EMISSAO <\/strong>(mais seletiva desse WHERE), talvez o SQL escolheria come\u00e7ar a execu\u00e7\u00e3o da query j\u00e1 pela tabela <strong>SF2<\/strong>.<\/p>\n<p>A tabela <strong>SF2<\/strong> tem apenas <strong>76 mil linhas<\/strong>, ent\u00e3o vai ser tranquilo criar esse \u00edndice com v\u00e1rias colunas:<\/p>\n<pre class=\"lang:tsql decode:true \">CREATE NONCLUSTERED INDEX SF2090W01\r\nON [dbo].SF2090 (F2_EMISSAO, F2_TRANSP,F2_FILIAL,F2_TIPO, D_E_L_E_T_)\r\nINCLUDE (F2_DOC, F2_SERIE, F2_CLIENTE, F2_LOJA, F2_VEND1, F2_VALBRUT,F2_VOLUME1,F2_PBRUTO) \r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>Mais uma vez nessa s\u00e9rie digo:<strong> WOWWWWWW!!!<\/strong><\/p>\n<p>A query de <strong>18 segundos<\/strong> passou a rodar em <strong>0 segundos<\/strong> com a cria\u00e7\u00e3o de um \u00edndice em uma tabela de <strong>76 mil linhas.<\/strong><\/p>\n<p>Segue o novo plano:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8473 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2.png\" alt=\"\" width=\"1064\" height=\"234\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2.png 1492w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-300x66.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-1024x225.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-768x169.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-700x154.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-410x90.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-100x22.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-275x60.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_2-20x4.png 20w\" sizes=\"auto, (max-width: 1064px) 100vw, 1064px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Ao inv\u00e9s de fazer um <strong>Seek<\/strong> <strong>1 milh\u00e3o de vezes<\/strong> na tabela <strong>SF2090<\/strong>, com o \u00edndice que eu criei, eu induzi o SQL Server a j\u00e1 fazer um <strong>Seek<\/strong> direto na <strong>SF2<\/strong> e j\u00e1 fazer o <strong>join<\/strong>\u00a0com a tabela <strong>ZZB<\/strong>.<\/p>\n<p>O SQL continua nos sugerindo a cria\u00e7\u00e3o de um \u00edndice, mas agora a query j\u00e1 roda em <strong>0 segundos<\/strong> e a quantidade de <strong>leituras<\/strong> praticamente <strong>zerou<\/strong>, n\u00e3o vale criar mais um \u00edndice para essa query nesse momento.<\/p>\n<pre class=\"lang:tsql decode:true\">--Antes da cria\u00e7\u00e3o do \u00edndice\r\nTable 'VT1090'. Scan count 0, logical reads 0\r\nTable 'SA1040'. Scan count 0, logical reads 0\r\nTable 'SF2090'. Scan count 1168821, logical reads 3725643\r\nTable 'SC5090'. Scan count 1, logical reads 4316\r\nTable 'ZZB090'. Scan count 1, logical reads 149\r\nTable 'SA4090'. Scan count 1, logical reads 13\r\n\r\n SQL Server Execution Times:\r\n   CPU time = 15906 ms,  elapsed time = 18008 ms.\r\n\r\n--Ap\u00f3s a cria\u00e7\u00e3o do \u00edndice\r\nTable 'VT1090'. Scan count 0, logical reads 0\r\nTable 'SA1040'. Scan count 0, logical reads 0\r\nTable 'SF2090'. Scan count 1, logical reads 156\r\nTable 'ZZB090'. Scan count 1, logical reads 149\r\nTable 'SA4090'. Scan count 1, logical reads 13\r\n\r\n SQL Server Execution Times:\r\n   CPU time = 47 ms,  elapsed time = 124 ms.<\/pre>\n<p>Redu\u00e7\u00e3o absurda com um \u00edndice pequeno. 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=\"size-full wp-image-8476 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3.png\" alt=\"\" width=\"1175\" height=\"102\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3.png 1175w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-300x26.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-1024x89.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-768x67.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-700x61.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-410x36.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-100x9.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-275x24.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte4_3-20x2.png 20w\" sizes=\"auto, (max-width: 1175px) 100vw, 1175px\" \/><\/p>\n<p>Ela rodou em <strong>0,26 segundos<\/strong> e a diferen\u00e7a de leituras de p\u00e1ginas<strong> (3.8 milh\u00f5es para 1.518)<\/strong> e do consumo de CPU<strong> (16 mil para 250)<\/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\/ Pegando mais uma query no Traces de queries demoradas. Essa query est\u00e1 demorando 18 segundos e fazendo um n\u00famero absurdo de leituras na tabela SF2090. Query: SELECT A1_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,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-8467","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\/8467","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=8467"}],"version-history":[{"count":9,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8467\/revisions"}],"predecessor-version":[{"id":13842,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8467\/revisions\/13842"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=8467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=8467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=8467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}