{"id":2234,"date":"2019-10-08T15:47:50","date_gmt":"2019-10-08T15:47:50","guid":{"rendered":"https:\/\/www.tiagoneves.net\/blog\/?p=2234"},"modified":"2019-10-08T15:47:57","modified_gmt":"2019-10-08T15:47:57","slug":"dicas-do-dia-a-dia-melhorando-a-performance-reduzindo-os-waits-do-t-log","status":"publish","type":"post","link":"https:\/\/www.tiagoneves.net\/blog\/dicas-do-dia-a-dia-melhorando-a-performance-reduzindo-os-waits-do-t-log\/","title":{"rendered":"Dicas do dia a dia &#8211; Melhorando a performance reduzindo os waits do T-Log"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ol\u00e1 pessoal tudo certo?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No post de hoje quero compartilhar com voc\u00eas uma situa\u00e7\u00e3o\nque \u00e9 bastante comum no meu dia a dia de Consultor de Banco de Dados SQL Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estava realizando uma atividade de tuning em um cliente e percebi que quando executava algo que escrevia no log de transa\u00e7\u00e3o e acompanhava o progresso atrav\u00e9s da <strong>sp_whoisactive<\/strong> ( <a href=\"http:\/\/whoisactive.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"http:\/\/whoisactive.com (opens in a new tab)\">http:\/\/whoisactive.com<\/a><a href=\"http:\/\/whoisactive.com\/\" target=\"_blank\" rel=\"noopener\">\/<\/a> )  eu visualizava alguns WAITs relacionados ao log de transa\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de simular o problema, vamos entender de maneira r\u00e1pida e simples como funciona o <strong>Transaction Log<\/strong> no SQL Server.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"409\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image.png?resize=358%2C409&#038;ssl=1\" alt=\"\" class=\"wp-image-2235\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image.png?w=358&amp;ssl=1 358w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image.png?resize=263%2C300&amp;ssl=1 263w\" sizes=\"auto, (max-width: 358px) 100vw, 358px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Como sabemos, quando estamos executando algum comando que fa\u00e7a a altera\u00e7\u00e3o, inser\u00e7\u00e3o ou exclus\u00e3o de dados, o SQL Server primeiro grava a opera\u00e7\u00e3o no Transaction Log para depois escrever no disco, correto?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R: <strong>N\u00c3O!!!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nesse meio a\u00ed tem um outro camarada chamado <strong>Log Buffer<\/strong>,\nque \u00e9 uma regi\u00e3o em mem\u00f3ria que est\u00e1 dentro do buffer pool do SQL Server. Somente\nap\u00f3s o <strong>checkpoint<\/strong> que vai acontecer um flush dos dados que est\u00e3o em\nmem\u00f3ria e eles ser\u00e3o movidos para o disco.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Agora vamos simular o problema.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para simular o problema eu vou criar uma nova database na minha inst\u00e2ncia chamada <strong>\u201cWait_Log\u201d<\/strong> e armazenei o <strong>Transanction Log<\/strong> em um <strong>HD externo<\/strong>. Ap\u00f3s criar a database, criei uma tabela e depois vou fazer umas inser\u00e7\u00f5es atrav\u00e9s do <strong>QueryStress<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE TBL_PAGAMENTO\n(ID_Pessoa INT,\nDt_Pagamento DATETIME,\nVl_Pagamento DECIMAL,\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ao executar a seguinte query em <strong>10 threads<\/strong> no QueryStress, comecei a ter os seguintes WAITs.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE @id INT\nSET @id = 1\n   WHILE @id &lt; 10000\n   BEGIN\n\tINSERT INTO TBL_PAGAMENTO\n       \tVALUES\n           (@id,\n\t\t   DATEADD(MINUTE,+75,GETDATE())\n           ,53.232+0.05)\n\tSET @id = @id + 1\n   END<\/code><\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"538\" height=\"340\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-2.png?resize=538%2C340&#038;ssl=1\" alt=\"\" class=\"wp-image-2237\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-2.png?w=538&amp;ssl=1 538w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-2.png?resize=300%2C190&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-2.png?resize=200%2C125&amp;ssl=1 200w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-4.png?resize=678%2C97&#038;ssl=1\" alt=\"\" class=\"wp-image-2241\" width=\"678\" height=\"97\"\/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-6.png?resize=678%2C141&#038;ssl=1\" alt=\"\" class=\"wp-image-2243\" width=\"678\" height=\"141\"\/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-7.png?resize=678%2C129&#038;ssl=1\" alt=\"\" class=\"wp-image-2244\" width=\"678\" height=\"129\"\/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Com o cen\u00e1rio criado, encontramos dois WAITs diferentes\nrelacionados ao Transaction Log: \u201cWRITELOG\u201d e \u201cLATCH-EX [LOG_MANAGER]\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WRITELOG \u2013 <\/strong>De maneira simples, esse \u00e9 o WAIT mais\ncomum relacionado ao T-Log. Ele est\u00e1 relacionado ao tempo que a Engine do SQL\nServer est\u00e1 esperando para escrever no T-Log.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>LATCH-EX [LOG_MANAGER]<\/strong> \u2013 Esse WAIT \u00e9 comum quando o\nSQL Server est\u00e1 realizando o auto-growth do arquivo do T-Log. Repare que no\nprint acima as transa\u00e7\u00f5es com esse WAIT est\u00e3o sendo bloqueadas pela transa\u00e7\u00e3o\ncom o ID 74, justamente a transa\u00e7\u00e3o que est\u00e1 fazendo o arquivo do T-Log\ncrescer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tamb\u00e9m podemos ver o valor alto de <strong>\u201cLog Flush Waits\u201d<\/strong> no <strong>perfmon<\/strong>, al\u00e9m do nosso valor de batch request estar baixo.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"436\" height=\"255\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-005.png?resize=436%2C255&#038;ssl=1\" alt=\"\" class=\"wp-image-2246\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-005.png?w=436&amp;ssl=1 436w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-005.png?resize=300%2C175&amp;ssl=1 300w\" sizes=\"auto, (max-width: 436px) 100vw, 436px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Como podemos tentar resolver ou amenizar esse problema?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bom, a primeira op\u00e7\u00e3o seria fazer uma optimiza\u00e7\u00e3o no c\u00f3digo, tentando quebrar o c\u00f3digo em intervalos menores, ou ent\u00e3o uma op\u00e7\u00e3o que testei foi a dica que o Fabiano Amorim deu no seu treinamento, <strong><a rel=\"noreferrer noopener\" aria-label=\"25 Dicas de Performance (opens in a new tab)\" href=\"https:\/\/cursos.fabriciolima.net\/course?courseid=25-dicas-de-performance-no-sql-server-parte-1\" target=\"_blank\">25 Dicas de Performance<\/a><\/strong>, na plataforma de treinamentos do #TeamFabricioLima, que \u00e9 <strong>colocar o WHILE dentro de uma transa\u00e7\u00e3o<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE @id INT\nSET @id = 1\nbegin tran\n   WHILE @id &lt; 10000\n   BEGIN\n    INSERT INTO TBL_PAGAMENTO\n           VALUES\n           (@id,\n           DATEADD(MINUTE,+75,GETDATE())\n           ,53.232+0.05)\n    SET @id = @id + 1\n   END\n commit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos comparar a performance.Os WAITs reduziram drasticamente, praticamente n\u00e3o consegui capturar mais o WRITELOG.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"423\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-008.png?resize=678%2C423&#038;ssl=1\" alt=\"\" class=\"wp-image-2247\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-008.png?w=744&amp;ssl=1 744w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-008.png?resize=300%2C187&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-008.png?resize=200%2C125&amp;ssl=1 200w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"207\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-8.png?resize=678%2C207&#038;ssl=1\" alt=\"\" class=\"wp-image-2249\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-8.png?w=696&amp;ssl=1 696w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-8.png?resize=300%2C91&amp;ssl=1 300w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos comparar a performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os WAITs reduziram drasticamente, praticamente n\u00e3o consegui\ncapturar mais o WRITELOG.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As estat\u00edsticas do consumo tamb\u00e9m melhoraram bastante!<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"423\" height=\"260\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-006.png?resize=423%2C260&#038;ssl=1\" alt=\"\" class=\"wp-image-2250\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-006.png?w=423&amp;ssl=1 423w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-006.png?resize=300%2C184&amp;ssl=1 300w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos observar, o contator <strong>\u201cLog Flush Wait Time\u201d<\/strong>\nficou zerado, o contador <strong>\u201cLog Flushes\/sec\u201d<\/strong> tamb\u00e9m reduziu bastante!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>E tempo de execu\u00e7\u00e3o tivemos alguma melhora?<\/strong><strong><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>R: SIM!!!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O tempo de execu\u00e7\u00e3o baixou de mais de 2 minutos para 45 segundos! Ou seja, foi reduzido mais da metade do tempo!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Por que tivemos essa melhora?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa melhora ocorreu por que o SQL Server processou as 10\nmil inser\u00e7\u00f5es em <strong>uma \u00fanica transa\u00e7\u00e3o<\/strong>. Nem sempre \u00e9 poss\u00edvel realizar\nessa otimiza\u00e7\u00e3o, mas ela pode ser uma boa solu\u00e7\u00e3o. J\u00e1 imaginou todo o trabalho\nque o SQL Server tem para abrir e fechar 10 mil transa\u00e7\u00f5es? Agora imagine como\nseria muito mais simples fazer tudo em uma \u00fanica transa\u00e7\u00e3o!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Podemos realizar outras melhorias?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R:<strong> SIM!!!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos utilizar uma funcionalidade do SQL Server chamada <strong>Delayed\nDurability<\/strong>. Quando habilitamos essa funcionalidade o SQL Server passa a\n\u201cignorar\u201d o log de transa\u00e7\u00e3o e escreve direto no disco. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea quiser conhecer mais sobre essa funcionalidade, o <a rel=\"noreferrer noopener\" aria-label=\"Caio  (opens in a new tab)\" href=\"https:\/\/www.caioamante.com.br\" target=\"_blank\">Caio <\/a><a href=\"https:\/\/www.caioamante.com.br\" target=\"_blank\" rel=\"noopener\">Amante<\/a> tem um v\u00eddeo no seu blog (<a href=\"https:\/\/www.caioamante.com.br\/o-funcionamento-do-delayed-durability\/\" target=\"_blank\" rel=\"noopener\">O <\/a><a rel=\"noreferrer noopener\" aria-label=\"funcionamento  (opens in a new tab)\" href=\"https:\/\/www.caioamante.com.br\/o-funcionamento-do-delayed-durability\/\" target=\"_blank\">funcionamento <\/a><a href=\"https:\/\/www.caioamante.com.br\/o-funcionamento-do-delayed-durability\/\" target=\"_blank\" rel=\"noopener\">do Delayed Durability<\/a>) que demonstra como utilizar, os benef\u00edcios e os riscos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--- O VALOR DEFAULT \u00c9 DISABLED\nALTER DATABASE Wait_Log SET DELAYED_DURABILITY = FORCED<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos executar a query novamente e verificar se vamos ter alguma melhora no tempo e nos contadores.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE @id INT\nSET @id = 1\nbegin tran\n   WHILE @id &lt; 10000\n   BEGIN\n    INSERT INTO TBL_PAGAMENTO\n           VALUES\n           (@id,\n           DATEADD(MINUTE,+75,GETDATE())\n           ,53.232+0.05)\n    SET @id = @id + 1\n   END\n commit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos as compara\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os contadores tiveram uma melhora consider\u00e1vel.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"403\" height=\"260\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-009.png?resize=403%2C260&#038;ssl=1\" alt=\"\" class=\"wp-image-2251\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-009.png?w=403&amp;ssl=1 403w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-009.png?resize=300%2C194&amp;ssl=1 300w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>\u201cLog Flush Wait Time\u201d<\/strong> ficou zerado e quase\ntriplicou os <strong>\u201cBatch Requests\u201d<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Novamente n\u00e3o consegui capturar o WAIT WRITELOG.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"581\" height=\"173\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-9.png?resize=581%2C173&#038;ssl=1\" alt=\"\" class=\"wp-image-2252\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-9.png?w=581&amp;ssl=1 581w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-9.png?resize=300%2C89&amp;ssl=1 300w\" sizes=\"auto, (max-width: 581px) 100vw, 581px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m disso, o tempo de execu\u00e7\u00e3o da nossa query caiu de 45 para 20 segundos!<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"426\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-011.png?resize=678%2C426&#038;ssl=1\" alt=\"\" class=\"wp-image-2253\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-011.png?w=743&amp;ssl=1 743w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-011.png?resize=300%2C189&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-011.png?resize=200%2C125&amp;ssl=1 200w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver, os benef\u00edcios de habilitar o \u201cDelayed\nDurability\u201d s\u00e3o grandes, ainda mais se for uma base ou inst\u00e2ncia de BI e ETL,\nonde uma perda m\u00ednima de dados e toler\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Poxa Tiago, legal at\u00e9 a\u00ed, mas tem mais alguma coisa que\npodemos melhorar?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R: <strong>SIM!!!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At\u00e9 aqui conseguimos obter grandes melhorias sem realizar\ninvestimentos financeiros (\u201cR$$$$$$$\u201d), mas agora o patr\u00e3o liberou uma verba e\nvamos torrar essa grana em um hardware TOP. Em ambientes OLTP, normalmente\ndevemos privilegiar o arquivo de log em um disco r\u00e1pido, ent\u00e3o se voc\u00ea tem\ncondi\u00e7\u00f5es de mover o seu transaction log para um disco mais r\u00e1pido, ou SSD,\nvoc\u00ea vai melhorar ainda mais a performance da nossa query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para finalizar, vou fazer um \u00faltimo teste. Agora o meu arquivo de T-Log tamb\u00e9m est\u00e1 armazenado em um disco SSD. Os contadores de performance tiveram alguns ganhos. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"427\" height=\"257\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-012.png?resize=427%2C257&#038;ssl=1\" alt=\"\" class=\"wp-image-2254\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-012.png?w=427&amp;ssl=1 427w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-012.png?resize=300%2C181&amp;ssl=1 300w\" sizes=\"auto, (max-width: 427px) 100vw, 427px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>\u201cLog Flush Wait Time\u201d<\/strong> ficou zerado e chegamos a\nquase 14 mil <strong>\u201cBatch Requests\/Sec\u201d!<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Novamente n\u00e3o tivemos o WAIT WRITELOG.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"192\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-10.png?resize=678%2C192&#038;ssl=1\" alt=\"\" class=\"wp-image-2255\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-10.png?w=718&amp;ssl=1 718w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-10.png?resize=300%2C85&amp;ssl=1 300w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m do tempo de execu\u00e7\u00e3o ter baixado de 20 para 13 segundos.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"425\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-014.png?resize=678%2C425&#038;ssl=1\" alt=\"\" class=\"wp-image-2256\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-014.png?w=745&amp;ssl=1 745w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-014.png?resize=300%2C188&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/T-Log-take-care-014.png?resize=200%2C125&amp;ssl=1 200w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m disso, existem outras boas pr\u00e1ticas que podemos utilizar para melhorar ainda mais a performance do T-Log, como por exemplo na hora de criar a database, alterar o auto-growth do T-Log para crescer em \u201cMB\u201d e n\u00e3o em \u201c%\u201d. Al\u00e9m disso, se voc\u00ea puder estimar o tamanho do T-Log e j\u00e1 cri\u00e1-lo no tamanho ideal, voc\u00ea evita opera\u00e7\u00f5es de growth no T-Log e consequentemente o WAIT LATCH-EX [LOG_MANAGER] (vide o print do in\u00edcio do post).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"654\" height=\"151\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-11.png?resize=654%2C151&#038;ssl=1\" alt=\"\" class=\"wp-image-2257\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-11.png?w=654&amp;ssl=1 654w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/image-11.png?resize=300%2C69&amp;ssl=1 300w\" sizes=\"auto, (max-width: 654px) 100vw, 654px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m dessas dicas, sempre tomem cuidado com a fragmenta\u00e7\u00e3o\ndos VLFs (Virtual Log File), eles podem impactar na performance das suas\nqueries, no tempo do restore dos seus backups e o tempo de sua inst\u00e2ncia voltar\nno caso de algum crash.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea quiser saber mais sobre os cuidados com a\nfragmenta\u00e7\u00e3o do T-Log, segue uma s\u00e9rie de posts que recomendo a leitura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/edvaldocastro.com\/vlf_control\/\" target=\"_blank\" rel=\"noopener\">C<\/a><a href=\"https:\/\/edvaldocastro.com\/vlf_control\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"ontrole Autom\u00e1tico dos VLFs - Edvaldo Castro (opens in a new tab)\">ontrole Autom\u00e1tico dos VLFs &#8211; Edvaldo Castro<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/sqlleroy.com\/2012\/09\/03\/fragmentacao-do-transaction-log-parte-i\/\" target=\"_blank\" rel=\"noopener\">Fragmenta\u00e7\u00e3o<\/a><a href=\"https:\/\/sqlleroy.com\/2012\/09\/03\/fragmentacao-do-transaction-log-parte-i\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" do Transaction Log \u2013 Parte 1 - Leandro Ribeiro (opens in a new tab)\"> do Transaction Log \u2013 Parte 1 &#8211; Leandro Ribeiro<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/sqlleroy.com\/2012\/09\/04\/fragmentacao-do-transaction-log-parte-ii\/\" target=\"_blank\" rel=\"noopener\">Fragmenta\u00e7\u00e3<\/a><a href=\"https:\/\/sqlleroy.com\/2012\/09\/04\/fragmentacao-do-transaction-log-parte-ii\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"o do Transaction Log \u2013 Parte 2 - Leandro Ribeiro (opens in a new tab)\">o do Transaction Log \u2013 Parte 2 &#8211; Leandro Ribeiro<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/kimberly\/transaction-log-vlfs-too-many-or-too-few\/\" target=\"_blank\" rel=\"noopener\">Transaction Lo<\/a><a href=\"https:\/\/www.sqlskills.com\/blogs\/kimberly\/transaction-log-vlfs-too-many-or-too-few\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"g VLFs \u2013 too many or too few? - Kimberly L. Tripp (opens in a new tab)\">g VLFs \u2013 too many or too few? &#8211; Kimberly L. Tripp<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea quiser fazer um <strong>curso sinistro<\/strong> e o melhor de tudo de <strong>forma gratuita<\/strong>, tem um treinamento de T-Log Internals do Luti no Youtube.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/playlist?list=PLGaWZx_3bztdZNnrFSluDpaPjaB6IAx6-\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/playlist?list=PLGaWZx_3bztdZNnrFSluDpaPjaB6IAx6-<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bom pessoal por hoje \u00e9 isso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um grande abra\u00e7o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tiago Neves<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Curta a minha p\u00e1gina no&nbsp;<a href=\"https:\/\/www.facebook.com\/TiagoNevesDBA\" target=\"_blank\" rel=\"noreferrer noopener\">facebook&nbsp;<\/a>e fique por dentro das novidades do mundo SQL Server.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 pessoal tudo certo? No post de hoje quero compartilhar com voc\u00eas uma situa\u00e7\u00e3o que \u00e9 bastante comum no meu dia a dia de Consultor de Banco de Dados SQL Server. Estava realizando uma atividade de tuning em um cliente e percebi que quando executava algo que escrevia no log de transa\u00e7\u00e3o e acompanhava o&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2259,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rop_custom_images_group":[],"rop_custom_messages_group":[],"rop_publish_now":"initial","rop_publish_now_accounts":{"twitter_91251433_91251433":""},"rop_publish_now_history":[],"rop_publish_now_status":"pending","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false,"_wpscppro_dont_share_socialmedia":false,"_wpscppro_custom_social_share_image":0,"_facebook_share_type":"","_twitter_share_type":"","_linkedin_share_type":"","_pinterest_share_type":"","_linkedin_share_type_page":"","_instagram_share_type":"","_medium_share_type":"","_threads_share_type":"","_google_business_share_type":"","_selected_social_profile":[],"_wpsp_enable_custom_social_template":false,"_wpsp_social_scheduling":{"enabled":false,"datetime":null,"platforms":[],"status":"template_only","dateOption":"today","timeOption":"now","customDays":"","customHours":"","customDate":"","customTime":"","schedulingType":"absolute"},"_wpsp_active_default_template":true},"categories":[2,220,16,26,20,138,239],"tags":[302,54,301,14,299,300,109],"class_list":["post-2234","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-casos-do-dia-a-dia","category-sql-server-2017","category-sqlserver-2014","category-sqlserver-2016","category-sqlserver-geral","category-troubleshooting","category-tuning","tag-log-buffer","tag-performance","tag-querystress","tag-sqlserver","tag-t-log","tag-vlf","tag-wait-types"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/10\/tlog.png?fit=188%2C255&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6eIyh-A2","jetpack-related-posts":[{"id":1850,"url":"https:\/\/www.tiagoneves.net\/blog\/como-que-foi-o-13o-encontro-do-sql-server-es\/","url_meta":{"origin":2234,"position":0},"title":"Como que foi o 13\u00ba Encontro do SQL Server &#8211; ES","author":"tiagoneves","date":"19 de julho de 2019","format":false,"excerpt":"Ol\u00e1 pessoal no post de hoje vou compartilhar um pouco de como que foi o 13\u00ba Encontro do Local Group SQL Server-ES. O encontro aconteceu na ultima quinta-feira (18\/07\/2019), onde tivemos o prazer de estar recebendo o Rodrigo Ribeiro, aproveitamos que ele estava em Vit\u00f3ria. E por que n\u00e3o realizar\u2026","rel":"","context":"Em &quot;Eventos&quot;","block_context":{"text":"Eventos","link":"https:\/\/www.tiagoneves.net\/blog\/category\/eventos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":1917,"url":"https:\/\/www.tiagoneves.net\/blog\/vem-ai-o-sql-saturday-vitoria\/","url_meta":{"origin":2234,"position":1},"title":"Vem a\u00ed o SQL Saturday Vit\u00f3ria","author":"tiagoneves","date":"2 de agosto de 2019","format":false,"excerpt":"Ol\u00e1 pessoal, tudo certo? No post de hoje, tenho o grande orgulho de estar compartilhar com voc\u00eas sobre o MAIOR EVENTO da comunidade de Plataforma de Dados do Esp\u00edrito Santo. H\u00e1 quase 2 anos atr\u00e1s o Fabricio Lima e Eu, come\u00e7amos o PASS Local Group \u201cSQL Server ES\u201d, logo em\u2026","rel":"","context":"Em &quot;Eventos&quot;","block_context":{"text":"Eventos","link":"https:\/\/www.tiagoneves.net\/blog\/category\/eventos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/07\/Logo2_SQL_Dark_RGB.png?fit=636%2C600&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":1678,"url":"https:\/\/www.tiagoneves.net\/blog\/e-2019-comeca-para-valer-parte-2-sql-server-es-11-e-sqlsat-bsb-819\/","url_meta":{"origin":2234,"position":2},"title":"E 2019 come\u00e7a para valer\u2026 Parte 2 (SQL Server ES #11 e SQLSat BSB #819)","author":"tiagoneves","date":"13 de mar\u00e7o de 2019","format":false,"excerpt":"Em 2019 teremos um record de eventos SQL Saturday no Brasil, vamos ter eventos nas regi\u00f5es: Sul, Sudeste, Centro Oeste e Nordeste.","rel":"","context":"Em &quot;Eventos&quot;","block_context":{"text":"Eventos","link":"https:\/\/www.tiagoneves.net\/blog\/category\/eventos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/SQLSatBsb.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/SQLSatBsb.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/SQLSatBsb.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/SQLSatBsb.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":89,"url":"https:\/\/www.tiagoneves.net\/blog\/alterando-o-tipo-autenticacao-do-sqlserver\/","url_meta":{"origin":2234,"position":3},"title":"Alterando o tipo autentica\u00e7\u00e3o do SQLServer","author":"tiagoneves","date":"10 de maio de 2015","format":false,"excerpt":"Ol\u00e1 pessoal tudo certo? Hoje vou postar sobre um erro que aconteceu comigo e perdi um tempo para encontrar o problema. O erro \u00e9 quando voc\u00ea vai logar com\u00a0usu\u00e1rio de SQL e aparece o erro \u201clogin failed for user: <nome_user>\u201d. Tentei de tudo para logar, troquei\u00a0a senha do usu\u00e1rio, testei\u2026","rel":"","context":"Em &quot;Scripts&quot;","block_context":{"text":"Scripts","link":"https:\/\/www.tiagoneves.net\/blog\/category\/scripts\/"},"img":{"alt_text":"1","src":"https:\/\/i0.wp.com\/tiagoneves.net\/blog\/wp-content\/uploads\/2015\/05\/18.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/tiagoneves.net\/blog\/wp-content\/uploads\/2015\/05\/18.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/tiagoneves.net\/blog\/wp-content\/uploads\/2015\/05\/18.jpg?resize=525%2C300 1.5x"},"classes":[]},{"id":385,"url":"https:\/\/www.tiagoneves.net\/blog\/feliz-natal-em-t-sql\/","url_meta":{"origin":2234,"position":4},"title":"Feliz Natal em T-SQL","author":"tiagoneves","date":"23 de dezembro de 2015","format":false,"excerpt":"Ol\u00e1 pessoal, Gostaria de desejar um Feliz Natal e um Pr\u00f3spero Ano Novo para todos os amigos. O cart\u00e3o foi gerado no SQL Server utilizando o SQL Server spatial data, para quem tiver interesse segue a fonte. Para download do script basta (clicar aqui). Obrigado a todos que acessaram o\u2026","rel":"","context":"Em &quot;Scripts&quot;","block_context":{"text":"Scripts","link":"https:\/\/www.tiagoneves.net\/blog\/category\/scripts\/"},"img":{"alt_text":"FelizNatal","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/12\/FelizNatal-1.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/12\/FelizNatal-1.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/12\/FelizNatal-1.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/12\/FelizNatal-1.png?resize=700%2C400 2x"},"classes":[]},{"id":468,"url":"https:\/\/www.tiagoneves.net\/blog\/atualizando-o-windows-server-de-um-cluster-sql-server\/","url_meta":{"origin":2234,"position":5},"title":"Atualizando o Windows Server de um Cluster SQL Server","author":"tiagoneves","date":"24 de fevereiro de 2016","format":false,"excerpt":"Ol\u00e1 pessoal tudo certo? No post de hoje vou comentar e demonstrar uma migra\u00e7\u00e3o de sistema operacional de um Cluster SQL Server que fiz essa semana. Cen\u00e1rio: Na empresa que trabalho tem um cluster SQL Server ativo\/passivo, nele tem 10 inst\u00e2ncias SQL Server 2008 R2 instaladas e os servidores eram\u2026","rel":"","context":"Em &quot;Casos do dia-a-dia&quot;","block_context":{"text":"Casos do dia-a-dia","link":"https:\/\/www.tiagoneves.net\/blog\/category\/casos-do-dia-a-dia\/"},"img":{"alt_text":"Windows_Cluster_Single_Node","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=700%2C400 2x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=1050%2C600 3x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2016\/02\/Windows_Cluster_Single_Node.png?resize=1400%2C800 4x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/comments?post=2234"}],"version-history":[{"count":4,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2234\/revisions"}],"predecessor-version":[{"id":2260,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2234\/revisions\/2260"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media\/2259"}],"wp:attachment":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media?parent=2234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/categories?post=2234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/tags?post=2234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}