{"id":2441,"date":"2026-07-02T16:49:37","date_gmt":"2026-07-02T16:49:37","guid":{"rendered":"https:\/\/www.tiagoneves.net\/blog\/?p=2441"},"modified":"2026-07-02T16:49:41","modified_gmt":"2026-07-02T16:49:41","slug":"conversao-implicita-no-sql-server-o-vilao-invisivel-da-performance","status":"publish","type":"post","link":"https:\/\/www.tiagoneves.net\/blog\/conversao-implicita-no-sql-server-o-vilao-invisivel-da-performance\/","title":{"rendered":"Convers\u00e3o Impl\u00edcita no SQL Server: O Vil\u00e3o Invis\u00edvel da Performance"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Quando falamos em performance no SQL Server, normalmente pensamos em \u00edndices ausentes, estat\u00edsticas desatualizadas ou consultas mal escritas. Mas existe um problema extremamente comum e muitas vezes ignorado capaz de transformar uma consulta r\u00e1pida em um gargalo: as <strong>convers\u00f5es impl\u00edcitas<\/strong> (<em>implicit conversions<\/em>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma simples diferen\u00e7a entre os tipos de dados utilizados em uma consulta pode fazer o SQL Server abandonar um <strong>Index Seek<\/strong> e executar um <strong>Index Scan<\/strong>, aumentando drasticamente o consumo de CPU, as leituras l\u00f3gicas e o tempo de resposta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com a populariza\u00e7\u00e3o dos ORMs (Entity Framework, Hibernate, NHibernate e outros), o problema ficou ainda mais frequente: muitos frameworks enviam par\u00e2metros usando tipos gen\u00e9ricos ou incompat\u00edveis com a defini\u00e7\u00e3o das colunas do banco e o desenvolvedor raramente percebe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">O que \u00e9 uma Convers\u00e3o Impl\u00edcita?<\/mark><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Uma convers\u00e3o impl\u00edcita ocorre quando o SQL Server precisa converter automaticamente um dos lados de uma compara\u00e7\u00e3o para que a opera\u00e7\u00e3o possa ser executada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>WHERE CodigoCliente = N'1000'<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se a coluna <code>CodigoCliente<\/code> for <code>INT<\/code>, o SQL Server precisar\u00e1 converter um dos lados da express\u00e3o para que os tipos sejam compat\u00edveis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pe\u00e7a-chave aqui \u00e9 a <strong>preced\u00eancia de tipos de dados<\/strong>. O SQL Server tem uma ordem que define qual lado ser\u00e1 convertido (por exemplo, <code>NVARCHAR<\/code> tem preced\u00eancia sobre <code>VARCHAR<\/code>, e tipos num\u00e9ricos t\u00eam preced\u00eancia sobre tipos de texto). Quando a convers\u00e3o recai sobre o <strong>literal\/par\u00e2metro<\/strong>, normalmente n\u00e3o h\u00e1 preju\u00edzo. O problema grave aparece quando a convers\u00e3o recai sobre a <strong>coluna<\/strong>: a condi\u00e7\u00e3o deixa de ser <em>sargable<\/em> e o otimizador \u00e9 for\u00e7ado a abandonar o Index Seek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em outras palavras: <strong>nem toda convers\u00e3o impl\u00edcita \u00e9 prejudicial \u2014 o que importa \u00e9 qual lado \u00e9 convertido.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>Demonstra\u00e7\u00e3o Pr\u00e1tica<\/strong><\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos criar uma tabela com 1 milh\u00e3o de registros.<br><br><code>DROP TABLE IF EXISTS dbo.Clientes;<br>GO<br><br>CREATE TABLE dbo.Clientes<br>(<br>    CodigoCliente INT NOT NULL,<br>    Nome VARCHAR(100) NOT NULL<br>);<br>GO<br><br>CREATE CLUSTERED INDEX IX_Clientes<br>ON dbo.Clientes (CodigoCliente);<br>GO<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>WITH Numeros AS ( SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Numero FROM sys.objects a CROSS JOIN sys.objects b CROSS JOIN sys.objects c ) INSERT INTO dbo.Clientes SELECT Numero, CONCAT('Cliente ', Numero) FROM Numeros; GO<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Consulta utilizando o tipo correto<\/mark><\/em><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SET STATISTICS IO, TIME ON;<br>GO<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SELECT *<br>FROM dbo.Clientes<br>WHERE CodigoCliente = 500000;<br>GO<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resultado esperado:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Index Seek<\/strong><\/li>\n\n\n\n<li>Pouqu\u00edssimas leituras l\u00f3gicas<\/li>\n\n\n\n<li>CPU pr\u00f3xima de zero<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"208\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=678%2C208&#038;ssl=1\" alt=\"\" class=\"wp-image-2443\" title=\"image\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?w=1310&amp;ssl=1 1310w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=300%2C92&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=1024%2C313&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=768%2C235&amp;ssl=1 768w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"111\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=678%2C111&#038;ssl=1\" alt=\"\" class=\"wp-image-2446\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=1024%2C167&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=300%2C49&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=768%2C125&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=1536%2C251&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?resize=2048%2C335&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-1.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Convers\u00e3o impl\u00edcita que N\u00c3O quebra o Seek<\/mark><\/em><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Este \u00e9 o ponto onde muitos artigos erram, ent\u00e3o vale a aten\u00e7\u00e3o:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SELECT * <br>FROM dbo.Clientes <br>WHERE CodigoCliente = N'500000';<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"164\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?resize=678%2C164&#038;ssl=1\" alt=\"\" class=\"wp-image-2447\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?resize=1024%2C248&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?resize=300%2C73&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?resize=768%2C186&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?resize=1536%2C372&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?w=1853&amp;ssl=1 1853w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-2.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"136\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=678%2C136&#038;ssl=1\" alt=\"\" class=\"wp-image-2448\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=1024%2C206&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=300%2C60&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=768%2C154&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=1536%2C309&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?resize=2048%2C411&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-3.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ao analisar o plano de execu\u00e7\u00e3o, voc\u00ea ver\u00e1 o aviso de convers\u00e3o:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CONVERT_IMPLICIT(int, [@1], 0)<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Repare que pela regra de preced\u00eancia, tipos num\u00e9ricos vencem tipos de texto. Aqui o SQL Server converte o <strong>literal<\/strong> (<code>N'500000'<\/code>) para <code>INT<\/code>, <strong>n\u00e3o a coluna<\/strong>, com isso o <strong>Index Seek \u00e9 preservado<\/strong> e a performance permanece praticamente id\u00eantica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A li\u00e7\u00e3o \u00e9 importante: ver <code>CONVERT_IMPLICIT<\/code> no plano n\u00e3o significa, por si s\u00f3, um problema de performance. O que precisamos investigar \u00e9 <strong>se a convers\u00e3o est\u00e1 caindo sobre a coluna<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\"><strong><em>O Exemplo Cl\u00e1ssico (e perigoso): VARCHAR vs NVARCHAR<\/em><\/strong><\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Este cen\u00e1rio \u00e9 extremamente comum em aplica\u00e7\u00f5es .NET, e aqui a convers\u00e3o realmente derruba a performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DROP TABLE IF EXISTS dbo.Produtos<br>GO<br><br>CREATE TABLE dbo.Produtos<br>(<br>Codigo VARCHAR(20) NOT NULL,<br>Descricao VARCHAR(100)<br>)<br><br>CREATE INDEX IX_Produtos_Codigo<br>ON dbo.Produtos (Codigo);<br>GO<\/code><br><code><br>WITH Numeros AS <\/code><br><code>( SELECT TOP (500000) <\/code><br><code>ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Numero FROM sys.objects a CROSS JOIN sys.objects b ) <\/code><br><code>INSERT INTO dbo.Produtos <\/code><br><code>SELECT CAST(Numero AS VARCHAR(20)), CONCAT('Produto ', Numero)<\/code><br><code>FROM Numeros<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Consulta correta<\/strong> (par\u00e2metro <code>VARCHAR<\/code>, igual \u00e0 coluna):<br><br><code>SELECT *<br>FROM dbo.Produtos<br>WHERE Codigo = '200000'<\/code>;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"160\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=678%2C160&#038;ssl=1\" alt=\"\" class=\"wp-image-2449\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=1024%2C242&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=300%2C71&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=768%2C182&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=1536%2C363&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?resize=2048%2C484&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-4.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"155\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=678%2C155&#038;ssl=1\" alt=\"\" class=\"wp-image-2450\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=1024%2C234&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=300%2C69&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=768%2C176&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=1536%2C351&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?resize=2048%2C469&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-5.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Consulta com par\u00e2metro <code>NVARCHAR<\/code><\/strong> (como muitos ORMs enviam por padr\u00e3o):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DECLARE @Codigo NVARCHAR(20) = N'200000'<br><br>SELECT *<br>FROM dbo.Produtos<br>WHERE Codigo = @Codigo;<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"165\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=678%2C165&#038;ssl=1\" alt=\"\" class=\"wp-image-2451\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=1024%2C249&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=300%2C73&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=768%2C186&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=1536%2C373&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?resize=2048%2C497&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-6.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"145\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=678%2C145&#038;ssl=1\" alt=\"\" class=\"wp-image-2452\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=1024%2C219&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=300%2C64&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=768%2C164&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=1536%2C328&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?resize=2048%2C438&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-7.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como <code>NVARCHAR<\/code> tem preced\u00eancia sobre <code>VARCHAR<\/code>, o SQL Server precisa converter a <strong>coluna<\/strong> <code>VARCHAR<\/code> para <code>NVARCHAR<\/code>. Intuitivamente, isso deveria quebrar o Seek e em muitos artigos \u00e9 apresentado como certeza absoluta. Mas aqui entra um detalhe que separa quem realmente entende do assunto: <strong>o comportamento depende da collation da coluna.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Coluna com SQL collation<\/strong> (ex: <code>SQL_Latin1_General_CP1_CI_AS<\/code>): o otimizador n\u00e3o consegue mapear a convers\u00e3o para uma busca no \u00edndice, neste caso o <strong>Index Scan<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Coluna com Windows collation<\/strong> (ex: <code>Latin1_General_CI_AI<\/code>) o SQL Server consegue aplicar um <em>range predicate<\/em> interno (um Seek com <code>GetRangeThroughConvert<\/code>) e, na maioria dos casos, <strong>mant\u00e9m o Index Seek<\/strong>, mesmo com o <code>CONVERT_IMPLICIT<\/code> aparecendo no plano.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver a instancia do meu servidor \u00e9 a<strong> Latin1_General_CI_AI<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-8.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"276\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-8.png?resize=678%2C276&#038;ssl=1\" alt=\"\" class=\"wp-image-2453\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-8.png?w=849&amp;ssl=1 849w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-8.png?resize=300%2C122&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-8.png?resize=768%2C312&amp;ssl=1 768w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja, se voc\u00ea testou esse exato cen\u00e1rio e viu o Seek se manter, <strong>n\u00e3o \u00e9 bug nem engano<\/strong> \u00e9 a collation Windows trabalhando a seu favor. Por isso esse exemplo, sozinho, n\u00e3o \u00e9 confi\u00e1vel para <em>demonstrar<\/em> uma quebra de Seek, o resultado muda conforme o banco.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>Na pr\u00e1tica:<\/strong> trate <code>coluna VARCHAR = par\u00e2metro NVARCHAR<\/code> como <strong>risco<\/strong>, n\u00e3o como falha garantida. Ele pode quebrar o Seek dependendo da collation, da vers\u00e3o e da cardinalidade. O ideal continua sendo alinhar os tipos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">O Vil\u00e3o Definitivo: coluna texto comparada com n\u00famero<\/mark><\/em><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para demonstrar uma quebra de Seek <strong>determin\u00edstic<\/strong>o que acontece independente de collation, vers\u00e3o ou sorte precisamos de um cen\u00e1rio em que a convers\u00e3o recaia obrigatoriamente sobre a <strong>coluna<\/strong>. A forma mais limpa uma coluna de texto comparada com um par\u00e2metro num\u00e9rico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse caso \u00e9 assustadoramente comum no mundo real <strong>chaves de neg\u00f3cio num\u00e9ricas armazenadas como <code>VARCHAR<\/code><\/strong> (c\u00f3digos de pedido, matr\u00edculas, n\u00fameros de documento) consultadas com par\u00e2metros <code>INT<\/code> (Isso acontece muito em ambientes Protheus e RM).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DROP TABLE IF EXISTS dbo.Pedidos;<br><br><br>CREATE TABLE dbo.Pedidos<br>(<br>    CodigoPedido VARCHAR(20) NOT NULL,   -- n\u00famero guardado como texto<br>    Valor DECIMAL(10,2)<br>);<br><br><br>CREATE INDEX IX_Pedidos_Codigo<br>ON dbo.Pedidos (CodigoPedido);<br><br><br>WITH Numeros AS<br>(<br>    SELECT TOP (500000)<br>           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Numero<br>    FROM sys.all_objects a<br>    CROSS JOIN sys.all_objects b<br>)<br>INSERT INTO dbo.Pedidos<br>SELECT CAST(Numero AS VARCHAR(20)), Numero * 1.5<br>FROM Numeros;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Consulta correta<\/strong> (par\u00e2metro <code>VARCHAR<\/code>, igual \u00e0 coluna):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"285\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?resize=678%2C285&#038;ssl=1\" alt=\"\" class=\"wp-image-2454\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?resize=1024%2C430&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?resize=300%2C126&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?resize=768%2C323&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?w=1521&amp;ssl=1 1521w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-9.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"134\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=678%2C134&#038;ssl=1\" alt=\"\" class=\"wp-image-2456\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=1024%2C203&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=300%2C59&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=768%2C152&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=1536%2C305&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?resize=2048%2C406&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-11.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Consulta problem\u00e1tica<\/strong> (par\u00e2metro <code>INT<\/code> contra coluna <code>VARCHAR<\/code>):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DECLARE @Codigo INT = 200000<br><br>SELECT * <br>FROM dbo.Pedidos <br>WHERE CodigoPedido = @Codigo;<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"580\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?resize=678%2C580&#038;ssl=1\" alt=\"\" class=\"wp-image-2457\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?resize=1024%2C876&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?resize=300%2C257&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?resize=768%2C657&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-12.png?w=1039&amp;ssl=1 1039w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?ssl=1\" rel=\"lightbox[2441]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"136\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=678%2C136&#038;ssl=1\" alt=\"\" class=\"wp-image-2458\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=1024%2C206&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=300%2C60&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=768%2C155&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=1536%2C309&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?resize=2048%2C412&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image-13.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui n\u00e3o h\u00e1 margem para interpreta\u00e7\u00e3o. Como <code>INT<\/code> tem preced\u00eancia sobre <code>VARCHAR<\/code>, o SQL Server \u00e9 <strong>obrigado<\/strong> a converter a coluna <code>CodigoPedido<\/code> para <code>INT<\/code> linha a linha. No plano voc\u00ea ver\u00e1 a convers\u00e3o aplicada diretamente sobre a coluna:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CONVERT_IMPLICIT(int, [Pedidos].[CodigoPedido], 0) = [@Codigo]<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A condi\u00e7\u00e3o deixa de ser <em>sargable<\/em>, o \u00edndice n\u00e3o pode mais ser percorrido por busca e o resultado \u00e9 um <strong>Index Scan garantido<\/strong> em qualquer collation, em qualquer vers\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compare os n\u00fameros: de <strong>3 leituras l\u00f3gicas<\/strong> para <strong>1.547<\/strong>, e de <strong>0 ms<\/strong> para <strong>78 ms de CPU<\/strong>,  numa tabela &#8220;pequena&#8221; de 500 mil linhas. Em tabelas com dezenas de milh\u00f5es de registros, esse fator se multiplica e vira incidente de produ\u00e7\u00e3o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Como Identificar Convers\u00f5es Impl\u00edcitas<\/mark><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode localizar planos no cache que cont\u00eam convers\u00f5es impl\u00edcitas com a consulta abaixo:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>SELECT<br>qs.execution_count,<br>st.text<br>FROM sys.dm_exec_query_stats qs<br>CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st<br>CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp<br>WHERE CAST(qp.query_plan AS NVARCHAR(MAX))<br>LIKE '%CONVERT_IMPLICIT%';<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Aten\u00e7\u00e3o em produ\u00e7\u00e3o:<\/mark><\/strong> essa consulta for\u00e7a a materializa\u00e7\u00e3o do XML de <strong>todos<\/strong> os planos em cache e faz um <code>LIKE<\/code> sobre eles. Em servidores movimentados, com milhares de planos, ela pode consumir CPU e mem\u00f3ria de forma relevante. <br>Execute em janelas de baixa carga e, idealmente, refine o filtro (por exemplo, juntando com <code>sys.dm_exec_query_stats<\/code> ordenado por <code>total_worker_time<\/code> para olhar s\u00f3 as consultas mais caras).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lembre-se: como vimos, nem todo <code>CONVERT_IMPLICIT<\/code> \u00e9 problema. Use essa lista como ponto de partida e confirme, no plano de cada consulta, <strong>se a convers\u00e3o est\u00e1 caindo sobre a coluna<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">E as vers\u00f5es mais novas resolvem isso?<\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Uma d\u00favida comum: ser\u00e1 que algum SQL Server mais recente eliminou esse problema? A resposta honesta \u00e9 <strong>n\u00e3o<\/strong>. O background \u00e9 o mesmo desde sempre se a convers\u00e3o recai sobre a coluna, o Seek vira Scan, do SQL Server 2008 ao 2025. O que evoluiu foi o <strong>ferramental ao redor<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Aviso expl\u00edcito no plano<\/strong> (desde o SQL Server 2012\/2014): hoje o plano exibe <em>&#8220;Type conversion in expression may affect CardinalityEstimate in query plan choice&#8221;<\/em>, em vez de voc\u00ea precisar ca\u00e7ar o <code>CONVERT_IMPLICIT<\/code> no XML. Facilita o diagn\u00f3stico, mas n\u00e3o corrige nada.<\/li>\n\n\n\n<li><strong>Extended Event <code>plan_affecting_convert<\/code><\/strong>: captura justamente as convers\u00f5es que <strong>de fato<\/strong> alteram o plano de execu\u00e7\u00e3o \u2014 separando o problema real das convers\u00f5es inofensivas (como o caso do literal que vimos no in\u00edcio). \u00c9 a ferramenta ideal para confirmar suspeitas.<\/li>\n\n\n\n<li><strong>Cardinality Estimation (CE) Feedback<\/strong> (SQL Server 2022, fam\u00edlia Intelligent Query Processing): aprende, ao longo de execu\u00e7\u00f5es repetidas, quando a estimativa de linhas de uma consulta est\u00e1 consistentemente errada e persiste um hint no Query Store para corrigir o plano nas pr\u00f3ximas vezes.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cuidado com a expectativa em torno do CE Feedback ele <strong>n\u00e3o corrige a convers\u00e3o impl\u00edcita<\/strong>. Ele ataca um <em>sintoma adjacente<\/em> (a estimativa de cardinalidade ruim que a convers\u00e3o costuma provocar), n\u00e3o a causa. Al\u00e9m disso, depende do <strong>Query Store habilitado<\/strong>, s\u00f3 atua sobre consultas <strong>repetidas<\/strong> e <strong>n\u00e3o corrige em tempo de execu\u00e7\u00e3o<\/strong> a primeira execu\u00e7\u00e3o ruim continua ruim. Se a convers\u00e3o est\u00e1 for\u00e7ando um Scan sobre a coluna, o CE Feedback n\u00e3o vai transform\u00e1-lo em Seek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Conclus\u00e3o:<\/strong> em mais de uma d\u00e9cada de evolu\u00e7\u00e3o, o SQL Server melhorou bastante a capacidade de <em>encontrar<\/em> e <em>atenuar o dano colateral<\/em> da convers\u00e3o impl\u00edcita mas a cura continua sendo a mesma de sempre <strong>alinhar os tipos de dados<\/strong>. Nenhuma vers\u00e3o te isenta de prestar aten\u00e7\u00e3o no tipo de dados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">O Papel dos ORMs<\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Atualmente, boa parte dos problemas de convers\u00e3o impl\u00edcita nasce <strong>fora<\/strong> do SQL Server, na camada da aplica\u00e7\u00e3o. \u00c9 comum encontrar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Coluna <code>VARCHAR<\/code> recebendo par\u00e2metro <code>NVARCHAR<\/code>.<\/li>\n\n\n\n<li>Coluna <code>BIGINT<\/code> recebendo par\u00e2metro <code>INT<\/code>.<\/li>\n\n\n\n<li>Coluna <code>DATETIME<\/code> recebendo par\u00e2metro <code>DATETIME2<\/code>.<\/li>\n\n\n\n<li>Chaves num\u00e9ricas sendo enviadas como strings.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">O desenvolvedor nem sempre percebe, porque a consulta <strong>retorna os dados corretos<\/strong>. O efeito colateral \u00e9 silencioso: o resultado vem certo, mas com um Scan car\u00edssimo por tr\u00e1s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Como Corrigir<\/mark><\/strong>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A boa not\u00edcia \u00e9 que a corre\u00e7\u00e3o costuma ser simples muitas vezes basta um ajuste de par\u00e2metro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>Corrija na camada da aplica\u00e7\u00e3o (prefer\u00edvel).<\/strong> \u00c9 onde o problema nasce e onde a solu\u00e7\u00e3o \u00e9 mais limpa.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Entity Framework:<\/strong> mapeie colunas <code>VARCHAR<\/code> como n\u00e3o-Unicode para que o EF gere par\u00e2metros <code>VARCHAR<\/code>:<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dapper:<\/strong> especifique o tipo do par\u00e2metro explicitamente<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>var p = new DynamicParameters();<br>p.Add(\"@Codigo\", \"200000\", DbType.AnsiString);<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Chave num\u00e9rica armazenada como texto<\/strong> (o caso do <code>dbo.Pedidos<\/code>): garanta que a aplica\u00e7\u00e3o envie o par\u00e2metro como <strong>string<\/strong>, e n\u00e3o como inteiro. No EF, modele a propriedade como <code>string<\/code>; no Dapper, passe o valor j\u00e1 como texto. Isso evita que o <code>INT<\/code> force a convers\u00e3o da coluna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Q<strong>uando n\u00e3o d\u00e1 para mudar a aplica\u00e7\u00e3o rapidamente,<\/strong> alinhe a defini\u00e7\u00e3o da coluna ao tipo que a aplica\u00e7\u00e3o envia (avaliando impacto e espa\u00e7o). Mudar <code>VARCHAR<\/code> para <code>NVARCHAR<\/code>, por exemplo, resolve a convers\u00e3o ao custo de dobrar o armazenamento daquela coluna. Para chaves que s\u00e3o de fato num\u00e9ricas, considere tamb\u00e9m corrigir o <strong>modelo de dados<\/strong> se o c\u00f3digo \u00e9 sempre um n\u00famero, armazen\u00e1-lo como <code>INT<\/code>\/<code>BIGINT<\/code> resolve a convers\u00e3o e ainda economiza espa\u00e7o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>Em \u00faltimo caso,<\/strong> uma convers\u00e3o expl\u00edcita no lado do par\u00e2metro pode for\u00e7ar o tipo correto, mas trate isso como paliativo a causa-raiz quase sempre est\u00e1 na aplica\u00e7\u00e3o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">SQL Server x PostgreSQL: filosofias diferentes<\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vale um paralelo r\u00e1pido para quem trabalha com os dois bancos. A forma como cada um lida com tipos incompat\u00edveis revela filosofias opostas e cada uma traz seus pr\u00f3prios benef\u00edcios e desafios..<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>SQL Server<\/strong> prioriza a <strong>compatibilidade<\/strong>: diante de uma compara\u00e7\u00e3o entre tipos diferentes, ele converte implicitamente para que a consulta simplesmente funcione. O lado bom \u00e9 que nada quebra, o lado ruim \u00e9 que essa conveni\u00eancia pode degradar a performance silenciosamente exatamente o cen\u00e1rio deste artigo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>PostgreSQL<\/strong> prioriza o <strong>rigor de tipos<\/strong>: muitas convers\u00f5es entre fam\u00edlias diferentes nem s\u00e3o impl\u00edcitas, e ele tende a <strong>falhar explicitamente<\/strong> em vez de converter no escuro. Na pr\u00e1tica, o problema \u00e9 empurrado do runtime para o desenvolvimento em troca de mais disciplina de tipagem da equipe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa diferen\u00e7a muda completamente como o mesmo descuido de ORM se manifesta em cada banco e o PostgreSQL tem seus pr\u00f3prios vil\u00f5es de \u00edndice subutilizado. Mas isso \u00e9 assunto para um pr\u00f3ximo artigo, dedicado a como a convers\u00e3o impl\u00edcita (e seus equivalentes) se comportam no PostgreSQL.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Conclus\u00e3o:<\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Convers\u00f5es impl\u00edcitas s\u00e3o um dos problemas de performance mais f\u00e1ceis de ignorar e, ao mesmo tempo, um dos mais simples de corrigir. Antes de criar novos \u00edndices ou aumentar os recursos do servidor, vale verificar se os tipos de dados usados pela aplica\u00e7\u00e3o correspondem exatamente aos tipos definidos no banco.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Muitas vezes, corrigir um \u00fanico par\u00e2metro transforma um Index Scan em um Index Seek e reduz drasticamente o tempo de execu\u00e7\u00e3o de uma consulta sem custo de hardware e sem reescrever a query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suspeita que sua aplica\u00e7\u00e3o esteja sofrendo com convers\u00f5es impl\u00edcitas e outros gargalos silenciosos? O <strong>Health Check do <\/strong><a href=\"https:\/\/dataplus.tec.br\" target=\"_blank\" rel=\"noopener\"><strong>DataPlus<\/strong> <\/a>identifica esses padr\u00f5es e mostra exatamente onde sua performance est\u00e1 sendo desperdi\u00e7ada. <a href=\"https:\/\/dataplus.tec.br\" target=\"_blank\" rel=\"noopener\">Fale com a gente<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando falamos em performance no SQL Server, normalmente pensamos em \u00edndices ausentes, estat\u00edsticas desatualizadas ou consultas mal escritas. Mas existe um problema extremamente comum e muitas vezes ignorado capaz de transformar uma consulta r\u00e1pida em um gargalo: as convers\u00f5es impl\u00edcitas (implicit conversions). Uma simples diferen\u00e7a entre os tipos de dados utilizados em uma consulta pode&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"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_feature_clip_id":0,"_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":"default","_twitter_share_type":"default","_linkedin_share_type":"default","_pinterest_share_type":"default","_linkedin_share_type_page":"","_instagram_share_type":"default","_medium_share_type":"default","_threads_share_type":"default","_google_business_share_type":"default","_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":[20,239],"tags":[671,134,54,673,35,240],"class_list":["post-2441","post","type-post","status-publish","format-standard","hentry","category-sqlserver-geral","category-tuning","tag-conversao-implicita","tag-dba","tag-performance","tag-plano-de-execucao","tag-sql-server","tag-tuning"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6eIyh-Dn","jetpack-related-posts":[{"id":1475,"url":"https:\/\/www.tiagoneves.net\/blog\/voce-sabe-a-diferenca-entre-uma-consulta-sargable-e-non-sargable\/","url_meta":{"origin":2441,"position":0},"title":"Voc\u00ea sabe a diferen\u00e7a entre uma consulta Sargable e Non-Sargable?","author":"tiagoneves","date":"24 de outubro de 2018","format":false,"excerpt":"Ol\u00e1 pessoal tudo certo? No post de hoje vou compartilhar com voc\u00eas a respeito de um conceito muito comum no SQL Server, que \u00e9 o conceito de SARG (\"S\" search argument) e Non-SARGable cuja a tradu\u00e7\u00e3o livre pode ser \"Argumento de busca\". O termo SARG nada mais \u00e9 que a\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":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2018\/10\/Consulta_3.1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1495,"url":"https:\/\/www.tiagoneves.net\/blog\/dicas-de-como-realizar-um-tuning-no-sql-server\/","url_meta":{"origin":2441,"position":1},"title":"Dicas de como realizar um tuning no SQL Server","author":"tiagoneves","date":"9 de maio de 2019","format":false,"excerpt":"Ol\u00e1 pessoal tudo certo? No post de hoje, eu quero compartilhar com voc\u00eas algumas dicas de como iniciar um tuning em alguma rotina, seja stored procedure, function ou query adhoc. Quando vamos iniciar um trabalho de tuning, uma das primeiras informa\u00e7\u00f5es que precisamos \u00e9 visualizar o plano de execu\u00e7\u00e3o da\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":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/05\/word-image-3-1.png?fit=352%2C278&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2216,"url":"https:\/\/www.tiagoneves.net\/blog\/como-tirei-a-certificacao-mcse-data-management-and-analytics\/","url_meta":{"origin":2441,"position":2},"title":"Como tirei a certifica\u00e7\u00e3o MCSE &#8211; Data Management and Analytics","author":"tiagoneves","date":"18 de setembro de 2019","format":false,"excerpt":"Ol\u00e1 pessoal tudo certo? No post de hoje eu vou comentar um pouco sobre provas de certifica\u00e7\u00e3o, especialmente sobre as provas 70-764, 70-765 e 70-465. Quem me acompanha nas redes sociais (LinkedIn \/ Twitter \/ Facebook) viu que nas \u00faltimas semanas eu recebi o t\u00edtulo de MCSE (Microsoft Certified Solutions\u2026","rel":"","context":"Em &quot;Certifica\u00e7\u00e3o&quot;","block_context":{"text":"Certifica\u00e7\u00e3o","link":"https:\/\/www.tiagoneves.net\/blog\/category\/certificacao\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/09\/MCSE-Data-Management-and-Analytics2019.png?fit=600%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/09\/MCSE-Data-Management-and-Analytics2019.png?fit=600%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/09\/MCSE-Data-Management-and-Analytics2019.png?fit=600%2C600&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":269,"url":"https:\/\/www.tiagoneves.net\/blog\/24h-pass-summit\/","url_meta":{"origin":2441,"position":3},"title":"24h Pass Summit","author":"tiagoneves","date":"14 de agosto de 2015","format":false,"excerpt":"Fala pessoal tudo certo? Vem ai mais uma edi\u00e7\u00e3o do\u00a024 Hours of PASS: Summit 2015 Preview,\u00a0s\u00e3o 24h de webcast com v\u00e1rios palestrantes, para participar basta entrar no site e se cadastrar \u00e9 gratuito, as palestras ser\u00e3o em ingl\u00eas. Segue a agenda: Beginners Guide to MDX 17 set 2015 12:00 GMT\u2026","rel":"","context":"Em &quot;Eventos&quot;","block_context":{"text":"Eventos","link":"https:\/\/www.tiagoneves.net\/blog\/category\/eventos\/"},"img":{"alt_text":"event-banner","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/08\/event-banner.jpg?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/08\/event-banner.jpg?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/08\/event-banner.jpg?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2015\/08\/event-banner.jpg?resize=700%2C400 2x"},"classes":[]},{"id":1850,"url":"https:\/\/www.tiagoneves.net\/blog\/como-que-foi-o-13o-encontro-do-sql-server-es\/","url_meta":{"origin":2441,"position":4},"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":2431,"url":"https:\/\/www.tiagoneves.net\/blog\/atualizacao-estatisticas-sql-server-vldb\/","url_meta":{"origin":2441,"position":5},"title":"Estat\u00edsticas SQL Server em VLDB: Por Que Atualizar Pode Ser Melhor Que Rebuild de \u00cdndices","author":"tiagoneves","date":"1 de junho de 2026","format":false,"excerpt":"Descubra por que a atualiza\u00e7\u00e3o de estat\u00edsticas SQL Server pode gerar mais performance que rebuild de \u00edndices em ambientes VLDB e janelas curtas de manuten\u00e7\u00e3o.","rel":"","context":"Em &quot;Tuning&quot;","block_context":{"text":"Tuning","link":"https:\/\/www.tiagoneves.net\/blog\/category\/tuning\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/StatisticsXRebuild.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/StatisticsXRebuild.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/StatisticsXRebuild.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/StatisticsXRebuild.png?resize=700%2C400 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2441","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=2441"}],"version-history":[{"count":2,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2441\/revisions"}],"predecessor-version":[{"id":2460,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2441\/revisions\/2460"}],"wp:attachment":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media?parent=2441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/categories?post=2441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/tags?post=2441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}