{"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>Ol\u00e1 pessoal tudo certo?<\/p>\n\n\n\n<p>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>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\/\">\/<\/a> )  eu visualizava alguns WAITs relacionados ao log de transa\u00e7\u00e3o.<\/p>\n\n\n\n<p>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>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>R: <strong>N\u00c3O!!!<\/strong><\/p>\n\n\n\n<p>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><strong>Agora vamos simular o problema.<\/strong><\/p>\n\n\n\n<p>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>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>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><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><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>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><strong>Como podemos tentar resolver ou amenizar esse problema?<\/strong><\/p>\n\n\n\n<p>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>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>Vamos comparar a performance.<\/p>\n\n\n\n<p>Os WAITs reduziram drasticamente, praticamente n\u00e3o consegui\ncapturar mais o WRITELOG.<\/p>\n\n\n\n<p>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>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><strong>E tempo de execu\u00e7\u00e3o tivemos alguma melhora?<\/strong><strong><\/strong><\/p>\n\n\n\n<p><strong>R: SIM!!!<\/strong><\/p>\n\n\n\n<p>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><strong>Por que tivemos essa melhora?<\/strong><\/p>\n\n\n\n<p>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><strong>Podemos realizar outras melhorias?<\/strong><\/p>\n\n\n\n<p>R:<strong> SIM!!!<\/strong><\/p>\n\n\n\n<p>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>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\">Amante<\/a> tem um v\u00eddeo no seu blog (<a href=\"https:\/\/www.caioamante.com.br\/o-funcionamento-do-delayed-durability\/\">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\/\">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>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>Vamos as compara\u00e7\u00f5es.<\/p>\n\n\n\n<p>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>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>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>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>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><strong>Poxa Tiago, legal at\u00e9 a\u00ed, mas tem mais alguma coisa que\npodemos melhorar?<\/strong><\/p>\n\n\n\n<p>R: <strong>SIM!!!<\/strong><\/p>\n\n\n\n<p>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>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>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>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>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>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>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>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><a href=\"https:\/\/edvaldocastro.com\/vlf_control\/\">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><a href=\"https:\/\/sqlleroy.com\/2012\/09\/03\/fragmentacao-do-transaction-log-parte-i\/\">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><a href=\"https:\/\/sqlleroy.com\/2012\/09\/04\/fragmentacao-do-transaction-log-parte-ii\/\">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><a href=\"https:\/\/www.sqlskills.com\/blogs\/kimberly\/transaction-log-vlfs-too-many-or-too-few\/\">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>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><a href=\"https:\/\/www.youtube.com\/playlist?list=PLGaWZx_3bztdZNnrFSluDpaPjaB6IAx6-\">https:\/\/www.youtube.com\/playlist?list=PLGaWZx_3bztdZNnrFSluDpaPjaB6IAx6-<\/a><\/p>\n\n\n\n<p>Bom pessoal por hoje \u00e9 isso.<\/p>\n\n\n\n<p>Um grande abra\u00e7o.<\/p>\n\n\n\n<p>Tiago Neves<\/p>\n\n\n\n<p>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 [&hellip;]<\/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","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_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},"_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":2414,"url":"https:\/\/www.tiagoneves.net\/blog\/sql-server-2016-esta-chegando-ao-fim-do-suporte-o-que-isso-significa-na-pratica\/","url_meta":{"origin":2234,"position":0},"title":"SQL Server 2016 est\u00e1 chegando ao fim do suporte: o que isso significa na pr\u00e1tica?","author":"tiagoneves","date":"27 de abril de 2026","format":false,"excerpt":"O SQL Server 2016 ter\u00e1 seu suporte estendido encerrado em 14 de julho de 2026, o que resultar\u00e1 na falta de atualiza\u00e7\u00f5es de seguran\u00e7a e suporte. Continuar usando essa vers\u00e3o traz riscos como vulnerabilidades e n\u00e3o conformidade regulat\u00f3ria. Planejar a migra\u00e7\u00e3o para vers\u00f5es mais recentes ou cloud deve ser prioridade\u2026","rel":"","context":"Em &quot;Seguran\u00e7a&quot;","block_context":{"text":"Seguran\u00e7a","link":"https:\/\/www.tiagoneves.net\/blog\/category\/seguranca\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/04\/sql_server_2016_eos_v3.png?fit=772%2C702&ssl=1&resize=700%2C400 2x"},"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}]}}