{"id":8435,"date":"2017-12-11T13:52:14","date_gmt":"2017-12-11T15:52:14","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=8435"},"modified":"2020-10-10T14:37:13","modified_gmt":"2020-10-10T17:37:13","slug":"melhorando-a-performance-de-consultas-no-totvs-protheus-parte-1","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2017\/12\/11\/melhorando-a-performance-de-consultas-no-totvs-protheus-parte-1\/","title":{"rendered":"Melhorando a Performance de Consultas no Totvs Protheus &#8211; Parte 1"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>No meu dia a dia de Consultor SQL Server, atendo muitos clientes com <strong>Totvs Protheus e SQL Server<\/strong>. Inclusive j\u00e1 compartilhei algumas experi\u00eancias com voc\u00eas aqui no Blog:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2013\/12\/14\/5-motivos-para-quem-utiliza-o-protheus-totvs-contratar-um-dba-sql-server\/\" target=\"_blank\" rel=\"noopener noreferrer\">5 motivos para quem utiliza o Protheus (Totvs) contratar um DBA SQL Server<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2017\/05\/23\/migrando-um-sql-server-2008-totvs-protheus-para-o-sql-server-2016-standard\/\" target=\"_blank\" rel=\"noopener noreferrer\">Migrando um SQL Server 2008 Totvs Protheus para o SQL Server 2016 Standard<\/a><\/li>\n<\/ul>\n<p>Como j\u00e1 disse nesses posts, os \u00edndices padr\u00f5es do Protheus n\u00e3o s\u00e3o os melhores para todas as consultas que s\u00e3o realizadas pelo ERP. <strong>Se ningu\u00e9m nunca criou \u00edndices customizados no seu ambiente, certamente voc\u00ea tem margem para melhoria de performance no sistema da Totvs.<\/strong><\/p>\n<p>Nesse cen\u00e1rio, passo bastante tempo melhorando a performance de ambientes Protheus com a cria\u00e7\u00e3o de \u00edndices.<\/p>\n<p><strong>E como eu fa\u00e7o isso Fabr\u00edcio?<\/strong><\/p>\n<p>O primeiro passo \u00e9 voc\u00ea identificar as queries mais demoradas, que normalmente s\u00e3o as queries que os usu\u00e1rios reclamam, pois ficam muito tempo esperando uma resposta das telas.<\/p>\n<p>Criando meus Alertas ou o meu CheckList, automaticamente voc\u00ea j\u00e1 implementa uma rotina para monitorar as queries que demoram mais de X segundos no seu BD:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2017\/10\/05\/video-criando-15-alertas-no-sql-server-em-apenas-5-minutos\/\" target=\"_blank\" rel=\"noopener noreferrer\">V\u00eddeo: Criando 15 Alertas no SQL Server em apenas 5 minutos<\/a><\/li>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2017\/05\/01\/criando-um-e-mail-de-checklist-diario-no-sql-server\/\" target=\"_blank\" rel=\"noopener noreferrer\">Criando um E-mail de CheckList Di\u00e1rio no SQL Server<\/a><\/li>\n<\/ul>\n<p>Feito isso, agora \u00e9 analisar uma a uma as queries que mais consomem <strong>CPU<\/strong>, que fazem mais <strong>Leituras<\/strong> ou as queries que mais <strong>se repetem<\/strong> em nosso log.<\/p>\n<p>Para tentar ajudar voc\u00eas nessa atividade de an\u00e1lise de queries, vou realizar uma s\u00e9rie de posts curtos com a an\u00e1lise de <strong>1 query por post<\/strong> para verem como a cria\u00e7\u00e3o de \u00edndices customizados se faz necess\u00e1ria no Protheus.<\/p>\n<p>Vamos come\u00e7ar por uma query bem simples, mas que \u00e9 um <strong>caso REAL de produ\u00e7\u00e3o<\/strong>.<\/p>\n<p>Em um dos meus clientes, peguei a seguinte query sendo executada algumas vezes durante o dia:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT   R_E_C_N_O_\r\nFROM     dbo.CT2010\r\nWHERE    D_E_L_E_T_ = ' '\r\n         AND ( CT2_CREDIT = '65454565464' )\r\nORDER BY CT2_FILIAL DESC ,\r\n         CT2_DATA DESC ,\r\n         CT2_LOTE DESC ,\r\n         CT2_SBLOTE DESC ,\r\n         CT2_DOC DESC ,\r\n         CT2_LINHA DESC ,\r\n         CT2_TPSALD DESC ,\r\n         CT2_EMPORI DESC ,\r\n         CT2_FILORI DESC ,\r\n         CT2_MOEDLC DESC ,\r\n         R_E_C_N_O_ DESC;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Sempre falo isso nas minhas palestras e treinamentos. A primeira coisa que voc\u00ea deve fazer ao come\u00e7ar a analisar uma query \u00e9<\/p>\n<pre class=\"lang:tsql decode:true\">set statistics io,time on -- para ver a quantidade de leitura e consumo de CPU da query\r\n--ctrl+M para ver o plano real da query ap\u00f3s a execu\u00e7\u00e3o<\/pre>\n<p>Ao setar essas op\u00e7\u00f5es e executar a query, podemos ver o plano de execu\u00e7\u00e3o abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8438 aligncenter\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1.png\" alt=\"\" width=\"1063\" height=\"177\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1.png 1346w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-300x50.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-1024x170.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-768x128.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-700x116.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-410x68.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-100x17.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-275x46.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_1-20x3.png 20w\" sizes=\"auto, (max-width: 1063px) 100vw, 1063px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>A query demorou<strong> 5.7 segundos<\/strong> e teve o seguinte consumo:<\/p>\n<pre class=\"lang:tsql decode:true\">Table 'CT2010'. Scan count 3, logical reads 91143\r\n\r\nSQL Server Execution Times:\r\n\r\n\u00a0\u00a0 CPU time = 10531 ms,\u00a0 elapsed time = 5764 ms<\/pre>\n<p>O SQL est\u00e1 fazendo um <strong>Scan<\/strong> em um \u00edndice <strong>nonclustered<\/strong>, mas como ele n\u00e3o tem todas as colunas que precisa nesse \u00edndice, depois ainda faz um <strong>Key Lookup<\/strong>\u00a0no \u00edndice <strong>clustered<\/strong> para pegar o resto das colunas que faltam.<\/p>\n<p>Todos os \u00edndices dessa tabela come\u00e7am com a coluna <strong>CT2_FILIAL<\/strong>, que n\u00e3o \u00e9 uma coluna com dados muito seletivos para descer r\u00e1pido na \u00e1rvore do \u00edndice e dar o resultado da query.<\/p>\n<p>No caso dessa query, o pr\u00f3prio SQL Server est\u00e1 te sugerindo um \u00edndice.<\/p>\n<p><strong>P\u00f4 Fabr\u00edcio&#8230; a\u00ed ficou f\u00e1cil&#8230;. nem precisava de um post&#8230;<\/strong><\/p>\n<p>Mas mesmo que ele n\u00e3o te sugerisse, quando voc\u00ea v\u00ea uma cl\u00e1usula como essa em um WHERE, o SQL Server est\u00e1 praticamente te implorando para voc\u00ea criar um \u00edndice por essa coluna (exceto quando essa coluna n\u00e3o \u00e9 muito seletiva).<\/p>\n<pre class=\"lang:tsql decode:true\">AND ( CT2_CREDIT = '65454565464' )<\/pre>\n<p><strong>Palavras do SQL Server para voc\u00ea que est\u00e1 analisando a query:<\/strong><\/p>\n<ul>\n<li><em>&#8220;Meu amigo, por favor, crie um \u00edndice nessa coluna CT2_CREDIT&#8221;<\/em><\/li>\n<li><em>&#8220;Estou trabalhando demais, economiza meu processamento a\u00ed. Please!!!&#8221;<\/em><\/li>\n<li><em>&#8220;Me ajuda que eu te ajudo DBA!&#8221;<\/em><\/li>\n<li>&#8220;Dev, entende como esse neg\u00f3cio de \u00edndice funciona e cria um a\u00ed para mim&#8230; help!! &#8220;<\/li>\n<\/ul>\n<p><strong>Nossa Resposta:<\/strong> OK SQL. Deixa comigo SQL. #tamojunto<\/p>\n<p>Quando o SQL te sugere um \u00edndice voc\u00ea faz o que? Cria n\u00e9! L\u00f3gico! Mel na chupeta! Muito f\u00e1cil! Easy!<\/p>\n<p>S\u00f3 tem um por\u00e9m. Essa tabela tem <strong>48 milh\u00f5es de registros<\/strong>.<\/p>\n<p>Olha o tamanho do \u00edndice que o SQL sugeriu criar:<\/p>\n<pre class=\"lang:tsql decode:true\">CREATE NONCLUSTERED INDEX CT2010W01\r\nON [dbo].[CT2010] ([CT2_CREDIT],[D_E_L_E_T_])\r\nINCLUDE ([CT2_FILIAL],[CT2_DATA],[CT2_LOTE],[CT2_SBLOTE],[CT2_DOC],[CT2_LINHA],[CT2_MOEDLC],[CT2_EMPORI],[CT2_FILORI],[CT2_TPSALD])\r\n<\/pre>\n<p>Vai demorar bastante para criar e ficar bem grande. Se fosse t\u00e3o f\u00e1cil assim o cliente nem nos contratava.<\/p>\n<p>E se eu tentar criar um \u00edndice s\u00f3 pela coluna\u00a0<strong>CT2_CREDIT<\/strong>? Ser\u00e1 que j\u00e1 \u00e9 suficiente para resolver meu problema e fazer a query rodar r\u00e1pida e sem consumir muitos recursos?<\/p>\n<p>Se a quantidade de registros retornada pela query for baixa, fazer um <strong>lookup<\/strong> n\u00e3o \u00e9 t\u00e3o custoso assim. Vamos tentar:<\/p>\n<pre class=\"lang:tsql decode:true\">CREATE NONCLUSTERED INDEX CT2010W01\r\nON [dbo].[CT2010] ([CT2_CREDIT])\r\nwith(FILLFACTOR=90,DATA_COMPRESSION=PAGE)<\/pre>\n<p>A cria\u00e7\u00e3o desse \u00edndice levou <strong>5 minutos<\/strong> (discos SSD) e o \u00edndice ficou com o <strong>420 MB<\/strong> de tamanho. Imagina o \u00edndice sugerido com muitas colunas.<\/p>\n<p><strong>WOW!!!!<\/strong> Ao rodar a query novamente ela passou a rodar de forma instant\u00e2nea:<\/p>\n<pre class=\"lang:tsql decode:true\">Table 'CT2010'. Scan count 1, logical reads 4\r\n\r\nSQL Server Execution Times:\r\nCPU time = 0 ms, elapsed time = 44 ms.<\/pre>\n<p>Esse \u00e9 o novo plano da query:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8439\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2.png\" alt=\"\" width=\"420\" height=\"161\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2.png 566w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2-300x115.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2-410x157.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2-100x38.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2-275x105.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_2-20x8.png 20w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><\/p>\n<p>Aquele \u00edndice gigante que o SQL sugeriu, iria fazer apenas um <strong>seek<\/strong>. O meu \u00edndice que \u00e9 bem menor, fez o <strong>seek + lookup<\/strong>. Contudo, podemos ver que j\u00e1 resolveu totalmente o problema da query.<\/p>\n<p>Dessa maneira, decidi manter esse \u00edndice menor para ter menos impacto na manuten\u00e7\u00e3o dele.<\/p>\n<p>Ap\u00f3s criarmos um \u00edndice, conseguimos acompanhar se ele est\u00e1 sendo bem utilizado ou n\u00e3o com a query abaixo:<\/p>\n<pre class=\"lang:tsql decode:true\">select getdate(), o.Name,i.name, s.user_seeks,s.user_scans,s.user_lookups, s.user_Updates,\r\nisnull(s.last_user_seek,isnull(s.last_user_scan,s.last_User_Lookup)) Ultimo_acesso,fill_factor\r\nfrom sys.dm_db_index_usage_stats s\r\njoin sys.indexes i on i.object_id = s.object_id and i.index_id = s.index_id\r\njoin sys.sysobjects o on i.object_id = o.id\r\nwhere s.database_id = db_id() and o.name in ('CT2010') \r\norder by s.user_seeks + s.user_scans + s.user_lookups desc<\/pre>\n<p>Bem legal para ver se nosso \u00edndice est\u00e1 sendo MUITO utilizado ou pouco. Se por acaso um \u00edndice customizado parar de ser utilizado, sua fun\u00e7\u00e3o \u00e9 excluir esse \u00edndice para que ele n\u00e3o gere mais I\/O sem necessidade (<strong>monitoramento cont\u00ednuo<\/strong>).<\/p>\n<p>Olhando no <a href=\"https:\/\/www.fabriciolima.net\/blog\/2010\/06\/05\/passo-a-passo-para-encontrar-as-querys-mais-demoradas-do-banco-de-dados-parte-1\/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Trace<\/strong><\/a>\u00a0de queries demoradas, a query ficou t\u00e3o r\u00e1pida que nem aparece mais l\u00e1. Tenho que apelar e colocar um <strong>waitfor delay<\/strong> para poder visualizar e comparar:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-8440\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3.png\" alt=\"\" width=\"1051\" height=\"226\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3.png 1051w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-300x65.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-1024x220.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-768x165.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-700x151.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-410x88.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-100x22.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-275x59.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2017\/12\/queryprotheysparte1_3-20x4.png 20w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/p>\n<p>Ela rodou em <strong>0,07 segundos<\/strong> e a diferen\u00e7a de leituras de p\u00e1ginas<strong> (91 mil para 145)<\/strong> e do consumo de CPU<strong> (10 mil para 15)<\/strong> \u00e9 consider\u00e1vel conforme pode ser visto acima.<\/p>\n<p>\u00c9 isso ai pessoal, essa \u00e9 a <strong>parte 1<\/strong> dessa s\u00e9rie de posts onde faremos a an\u00e1lise de queries em um ambiente real do Protheus.<\/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=\"external noopener noreferrer nofollow\" 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 class=\"external-link wpel-icon-left\" href=\"https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s\" target=\"_blank\" rel=\"noopener noreferrer nofollow external\" data-wpel-link=\"external\">https:\/\/www.youtube.com\/watch?v=BKmUa3aZn6s<\/a><\/div>\n<div><\/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, No meu dia a dia de Consultor SQL Server, atendo muitos clientes com Totvs Protheus e SQL Server. Inclusive j\u00e1 compartilhei algumas experi\u00eancias com voc\u00eas aqui no Blog: 5 motivos para quem utiliza o Protheus (Totvs) contratar um DBA SQL Server Migrando um SQL Server 2008 Totvs Protheus para o SQL Server 2016 [&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-8435","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\/8435","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=8435"}],"version-history":[{"count":6,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8435\/revisions"}],"predecessor-version":[{"id":13848,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/8435\/revisions\/13848"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=8435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=8435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=8435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}