{"id":2463,"date":"2026-07-14T19:26:10","date_gmt":"2026-07-14T19:26:10","guid":{"rendered":"https:\/\/www.tiagoneves.net\/blog\/?p=2463"},"modified":"2026-07-14T19:26:13","modified_gmt":"2026-07-14T19:26:13","slug":"conversao-implicita-no-postgresql-por-que-o-comportamento-e-diferente-do-sql-server-e-onde-a-performance-realmente-morre","status":"publish","type":"post","link":"https:\/\/www.tiagoneves.net\/blog\/conversao-implicita-no-postgresql-por-que-o-comportamento-e-diferente-do-sql-server-e-onde-a-performance-realmente-morre\/","title":{"rendered":"Convers\u00e3o impl\u00edcita no PostgreSQL: por que o comportamento \u00e9 diferente do SQL Server (e onde a performance realmente morre)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-white-color\">Uma novidade antes de come\u00e7ar<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se voc\u00ea acompanha o blog h\u00e1 algum tempo, j\u00e1 percebeu que praticamente tudo por aqui gira em torno de SQL Server. E faz sentido s\u00e3o mais de 15 anos vivendo esse banco em produ\u00e7\u00e3o, entre troubleshooting, corrup\u00e7\u00f5es de banco, migra\u00e7\u00f5es, tuning e muita madrugada de plant\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas o mercado de dados mudou, e o PostgreSQL deixou de ser &#8220;<strong>o outro banco<\/strong>&#8221; para se tornar presen\u00e7a obrigat\u00f3ria na vida de qualquer DBA, est\u00e1 nas nuvens (RDS, Azure Database, Cloud SQL), nas startups, nas migra\u00e7\u00f5es de redu\u00e7\u00e3o de custo de licenciamento e cada vez mais, nas grandes empresas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e1 alguns meses venho estudando PostgreSQL a fundo, com foco de administra\u00e7\u00e3o e performance montando laborat\u00f3rio, quebrando, corrigindo e documentando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o, a partir deste post, <strong>o blog tamb\u00e9m ter\u00e1 conte\u00fado de PostgreSQL<\/strong>. E vou fazer do jeito que gostaria que tivessem feito comigo quando comecei, explicando cada comando novo que aparecer e sempre que poss\u00edvel, <strong>comparando com o equivalente no SQL Server<\/strong> porque aprender um banco novo fica muito mais f\u00e1cil quando voc\u00ea ancora no que j\u00e1 conhece. Ent\u00e3o se voc\u00ea \u00e9 DBA SQL Server curioso sobre o mundo Postgres, este blog agora tamb\u00e9m \u00e9 pra voc\u00ea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E nada melhor para estrear do que dar sequ\u00eancia a um assunto que j\u00e1 conhecemos bem por aqui.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-white-color\">O problema<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">No <a href=\"#\">post <\/a><a href=\"https:\/\/www.tiagoneves.net\/blog\/conversao-implicita-no-sql-server-o-vilao-invisivel-da-performance\/\" data-type=\"link\" data-id=\"https:\/\/www.tiagoneves.net\/blog\/conversao-implicita-no-sql-server-o-vilao-invisivel-da-performance\/\">anterior<\/a>, vimos como no SQL Server uma tipagem errada o cl\u00e1ssico <code>VARCHAR<\/code> vs <code>NVARCHAR<\/code> gera convers\u00f5es impl\u00edcitas silenciosas que transformam Index Seeks em Index Scans. A pergunta natural de quem trabalha com os dois bancos \u00e9: <strong>e no PostgreSQL, isso acontece igual?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A resposta curta e grossa (=D) <strong>n\u00e3o igual mas acontece, e em lugares diferentes dos que voc\u00ea espera.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O sistema de tipos do PostgreSQL \u00e9 mais r\u00edgido que do SQL Server, onde o SQL Server tenta &#8220;adivinhar&#8221; e ajustar convertendo em segundo plano, o PostgresSQL muitas vezes simplesmente recusa a query com erro e isso \u00e9 uma prote\u00e7\u00e3o. Mas quando a convers\u00e3o impl\u00edcita <em>passa<\/em> e cai na coluna e a\u00ed o \u00edndice B-Tree morre do mesmo jeito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste post vou mostrar, com <code>EXPLAIN ANALYZE<\/code> real em um PostgreSQL 18, onde o \u00edndice sobrevive, onde ele morre, e um recurso do Postgres que o SQL Server n\u00e3o tem para resolver o problema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-white-color\">Montando o ambiente de teste<\/mark><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um detalhe did\u00e1tico importante, <strong>n\u00e3o adianta testar isso com meia d\u00fazia de linhas.<\/strong> Com uma tabela de 4 registros, o planner escolhe Seq Scan sempre, porque a tabela inteira cabe em uma p\u00e1gina e voc\u00ea vai concluir errado. Vamos popular com pelo menos 100 mil linhas com <code>generate_series<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE clientes (\n    id SERIAL PRIMARY KEY,\n    codigo_cliente VARCHAR(20) NOT NULL,\n    nome VARCHAR(100) NOT NULL,\n    criado_em TIMESTAMP NOT NULL DEFAULT now()\n);\n\nINSERT INTO clientes (codigo_cliente, nome, criado_em)\nSELECT 'C' || LPAD(g::text, 6, '0'),\n       'Cliente ' || g,\n       now() - (g || ' minutes')::interval\nFROM generate_series(1, 100000) g;\n\nCREATE INDEX idx_clientes_codigo ON clientes(codigo_cliente);\nCREATE INDEX idx_clientes_criado_em ON clientes(criado_em);\n\nANALYZE clientes;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-cyan-bluish-gray-color\">Traduzindo para &#8220;SQL Server\u00eas&#8221;:<\/mark><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SERIAL<\/code> \u00e9 o <code>IDENTITY(1,1)<\/code> do Postgres (por baixo, ele cria uma <em>sequence<\/em> em vers\u00f5es novas, prefira <code>GENERATED ALWAYS AS IDENTITY<\/code>, mas <code>SERIAL<\/code> ainda funciona muito bem);<\/li>\n\n\n\n<li><code>generate_series(1, 100000)<\/code> gera uma tabela virtual de n\u00fameros a famosa <em>tally table<\/em> que sempre improvisamos no SQL Server (que, ali\u00e1s, ganhou <code>GENERATE_SERIES<\/code> nativo s\u00f3 no SQL Server 2022);<\/li>\n\n\n\n<li><code>::<\/code> \u00e9 o operador de cast do PostgresSQL, <code>g::text<\/code> equivale a <code>CAST(g AS VARCHAR)<\/code>. Guarde esse operador ele \u00e9 o protagonista deste post.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">E o <code>ANALYZE clientes<\/code>? \u00c9 o equivalente ao UPDATE<code> <\/code>STATISTICS<code> <\/code>do SQL Server coleta estat\u00edsticas da tabela (cardinalidade, valores mais comuns, histogramas) para o planner estimar corretamente os custos. Como acabamos de encher uma tabela que nasceu vazia, rod\u00e1-lo explicitamente garante que o seu plano saia igual ao do post, sem esperar o autovacuum disparar a coleta autom\u00e1tica. Cuidado para n\u00e3o confundir o <code>ANALYZE <\/code>com o <code>EXPLAIN ANALYZE<\/code> das queries a seguir l\u00e1, <code>ANALYZE<\/code> significa &#8220;execute a query de verdade e mostre os tempos reais&#8221;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-cyan-bluish-gray-color\">Antes de come\u00e7ar: como ver os planos (psql e pgAdmin)<\/mark><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Todos os planos deste post foram gerados com <code>EXPLAIN ANALYZE<\/code> em modo texto que funciona igual no <code>psql<\/code> e no pgAdmin, escreva <code>EXPLAIN ANALYZE<\/code> antes da query e execute normalmente (<strong>F5<\/strong> no pgAdmin). O plano volta como texto na coluna <code>QUERY PLAN<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas o pgAdmin tamb\u00e9m tem um <strong>plano gr\u00e1fico<\/strong>, no estilo do plano de execu\u00e7\u00e3o visual do SSMS e aqui mora uma pegadinha que confunde muita gente vinda do SQL Server. (inclusive apanhei no come\u00e7o :=))<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Plano em texto<\/strong> \u2192 query <strong>com<\/strong> <code>EXPLAIN ANALYZE<\/code> escrito + execu\u00e7\u00e3o normal (F5);<\/li>\n\n\n\n<li><strong>Plano gr\u00e1fico<\/strong> \u2192 query <strong>sem<\/strong> <code>EXPLAIN<\/code> nenhum + os bot\u00f5es de Explain do Query Tool: <strong>F7<\/strong> para o plano estimado (o Ctrl+L do SSMS) ou <strong>Shift+F7<\/strong> para o plano real (o Ctrl+M do SSMS).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Os dois modos s\u00e3o mutuamente exclusivos: se voc\u00ea escrever <code>EXPLAIN ANALYZE<\/code> na query <strong>e<\/strong> apertar Shift+F7, o pgAdmin adiciona um segundo <code>EXPLAIN<\/code> por baixo dos panos (<code>EXPLAIN (ANALYZE, FORMAT JSON) EXPLAIN ANALYZE SELECT...<\/code>), o servidor devolve erro de sintaxe e nada aparece. \u00c9 o mesmo motivo pelo qual, no SSMS, voc\u00ea n\u00e3o escreve <code>SET SHOWPLAN_XML ON<\/code> junto com o Ctrl+M  bot\u00e3o j\u00e1 faz isso por voc\u00ea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No modo gr\u00e1fico, leia o diagrama da direita para a esquerda (como no SSMS) e explore as sub-abas: <strong>Graphical<\/strong> (setas mais grossas = mais linhas fluindo seta gorda saindo de um Seq Scan \u00e9 alerta), <strong>Analysis<\/strong> (compare <em>rows estimado vs real<\/em>: diverg\u00eancia grande \u00e9 sinal de estat\u00edstica desatualizada lembre do <code>ANALYZE<\/code>) e <strong>Statistics<\/strong>. No dropdown do bot\u00e3o, habilite <strong>Buffers<\/strong> para ter o equivalente ao <code>SET STATISTICS IO ON<\/code>: p\u00e1ginas vindas do cache (<code>shared hit<\/code>) vs lidas do disco (<code>read<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE\nSELECT id, nome\nFROM clientes\nWHERE codigo_cliente = 'C001003';<\/code><\/pre>\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\/07\/image.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"125\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image.png?resize=678%2C125&#038;ssl=1\" alt=\"\" class=\"wp-image-2465\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image.png?resize=1024%2C189&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image.png?resize=300%2C55&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image.png?resize=768%2C142&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image.png?w=1077&amp;ssl=1 1077w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Index Scan, 0.046 ms. Perfeito.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Cuidado para n\u00e3o confunfir o SCAN no PostgreSQL, <code>Index Scan<\/code> \u00e9 a busca pontual pela \u00e1rvore do \u00edndice ou seja, o que no SQL Server chamamos de <strong>Index Seek<\/strong>. O equivalente ao <em>Index Scan<\/em> do SQL Server (varrer o \u00edndice inteiro) existe, mas o PostgreSQL tamb\u00e9m pode aparecer como <code>Bitmap Index Scan<\/code> ou, para varredura completa da tabela, <code>Seq Scan<\/code> (o nosso <em>Table Scan<\/em>). Todo DBA SQL Server estranha isso nos primeiros <code>EXPLAIN<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas repare em um detalhe que quase ningu\u00e9m nota: o <code>Index Cond<\/code> mostra <code>(codigo_cliente)::text<\/code>. <strong>O cast para <code>text<\/code> est\u00e1 ali mesmo na query &#8220;ideal&#8221;.<\/strong><br><\/p>\n<\/blockquote>\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\/07\/image-1.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"148\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-1.png?resize=678%2C148&#038;ssl=1\" alt=\"\" class=\"wp-image-2466\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-1.png?resize=1024%2C224&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-1.png?resize=300%2C66&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-1.png?resize=768%2C168&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-1.png?w=1142&amp;ssl=1 1142w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Isso acontece porque <code>VARCHAR<\/code> no PostgreSQL n\u00e3o tem operadores de compara\u00e7\u00e3o pr\u00f3prios ele usa os operadores de <code>text<\/code> atrav\u00e9s de um cast <em>binary-coercible<\/em> (os dois tipos t\u00eam a mesma representa\u00e7\u00e3o em disco). Esse cast \u00e9 gratuito e <strong>n\u00e3o impede o uso do \u00edndice<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cen\u00e1rio 2 &#8211; O mito: <code>::text<\/code> na coluna N\u00c3O quebra o \u00edndice<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui est\u00e1 uma pegadinha que circula por a\u00ed (inclusive em respostas geradas por IA), a ideia de que qualquer <code>CAST<\/code> na coluna do <code>WHERE<\/code> anula o \u00edndice. No PostgreSQL, <strong>isso n\u00e3o \u00e9 verdade para casts binary-coercible<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE\nSELECT id, nome\nFROM clientes\nWHERE codigo_cliente::text = 'C001003'::text;<\/code><\/pre>\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\/07\/image-2.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"270\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-2.png?resize=678%2C270&#038;ssl=1\" alt=\"\" class=\"wp-image-2467\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-2.png?resize=1024%2C408&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-2.png?resize=300%2C119&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-2.png?resize=768%2C306&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-2.png?w=1512&amp;ssl=1 1512w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/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\/07\/image-3.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"56\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-3.png?resize=678%2C56&#038;ssl=1\" alt=\"\" class=\"wp-image-2468\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-3.png?resize=1024%2C85&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-3.png?resize=300%2C25&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-3.png?resize=768%2C64&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-3.png?w=1523&amp;ssl=1 1523w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/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\">Mesmo plano, mesmo \u00edndice, mesma performance. <code>VARCHAR \u2194 TEXT<\/code> \u00e9 o &#8220;casal feliz&#8221; do Postgres \u00e9 o oposto do drama <code>VARCHAR<\/code> vs <code>NVARCHAR<\/code> do SQL Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A regra correta n\u00e3o \u00e9 &#8220;cast na coluna quebra \u00edndice&#8221;. A regra \u00e9 <strong>o \u00edndice quebra quando a express\u00e3o sobre a coluna produz algo que o \u00edndice n\u00e3o indexou.<\/strong> Vamos ver onde isso acontece de verdade.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cen\u00e1rio 3 &#8211; Onde o \u00edndice morre de verdade: <code>INTEGER<\/code> vs <code>NUMERIC<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A coluna <code>id<\/code> \u00e9 <code>INTEGER<\/code> e tem \u00edndice (PK). Agora imagine que a aplica\u00e7\u00e3o ou o ORM manda o par\u00e2metro como decimal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE\nSELECT id, nome\nFROM clientes\nWHERE id = 1003.0;<\/code><\/pre>\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\/07\/image-4.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"291\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-4.png?resize=678%2C291&#038;ssl=1\" alt=\"\" class=\"wp-image-2469\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-4.png?resize=1024%2C440&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-4.png?resize=300%2C129&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-4.png?resize=768%2C330&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-4.png?w=1498&amp;ssl=1 1498w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/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\/07\/image-5.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"125\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-5.png?resize=678%2C125&#038;ssl=1\" alt=\"\" class=\"wp-image-2470\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-5.png?resize=1024%2C189&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-5.png?resize=300%2C55&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-5.png?resize=768%2C142&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-5.png?w=1079&amp;ssl=1 1079w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ali est\u00e1 a convers\u00e3o impl\u00edcita cl\u00e1ssica, em pleno PostgreSQL: o literal <code>1003.0<\/code> \u00e9 <code>NUMERIC<\/code>, n\u00e3o existe operador <code>integer = numeric<\/code> na fam\u00edlia de operadores do \u00edndice B-Tree, ent\u00e3o o planner <strong>converte a coluna<\/strong> (<code>(id)::numeric<\/code>) e o \u00edndice da PK vira paisagem. Seq Scan, 99.999 linhas descartadas, <strong>244x mais lento<\/strong> (14,2 ms vs 0,058 ms). Em uma tabela de 100 milh\u00f5es de linhas, isso \u00e9 a diferen\u00e7a entre milissegundos e minutos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E o famoso <code>INT<\/code> vs <code>BIGINT<\/code> que assusta muita gente? esse funciona bem, sem convers\u00e3o de dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>EXPLAIN ANALYZE<br>SELECT id, nome<br>FROM clientes<br>WHERE id = 1003<\/code>;<\/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\/07\/image-6.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"166\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-6.png?resize=678%2C166&#038;ssl=1\" alt=\"\" class=\"wp-image-2471\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-6.png?w=1018&amp;ssl=1 1018w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-6.png?resize=300%2C73&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-6.png?resize=768%2C188&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\/07\/image-7.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"220\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-7.png?resize=678%2C220&#038;ssl=1\" alt=\"\" class=\"wp-image-2472\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-7.png?resize=1024%2C332&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-7.png?resize=300%2C97&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-7.png?resize=768%2C249&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-7.png?w=1504&amp;ssl=1 1504w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/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\">Os tipos de dados inteiros (<code>smallint<\/code>, <code>integer<\/code>, <code>bigint<\/code>) compartilham a mesma fam\u00edlia de operadores B-Tree (<code>integer_ops<\/code>), com operadores <em>cross-type<\/em> nativos. O problema \u00e9 sempre quando entra <code>NUMERIC<\/code>, <code>REAL<\/code> ou <code>DOUBLE PRECISION<\/code> na compara\u00e7\u00e3o com coluna inteira.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cen\u00e1rio 4 &#8211; A rigidez que protege<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">E se compararmos <code>VARCHAR<\/code> com n\u00famero, o cen\u00e1rio que no SQL Server gera convers\u00e3o silenciosa (e \u00e0s vezes erro em runtime no meio da produ\u00e7\u00e3o)?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id \nFROM clientes \nWHERE codigo_cliente = 1003;<\/code><\/pre>\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\/07\/image-8.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"119\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-8.png?resize=678%2C119&#038;ssl=1\" alt=\"\" class=\"wp-image-2474\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-8.png?w=853&amp;ssl=1 853w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-8.png?resize=300%2C53&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-8.png?resize=768%2C135&amp;ssl=1 768w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O PostgreSQL nem executa. Enquanto o SQL Server converteria a coluna inteira silenciosamente, o Postgres devolve o problema para o desenvolvedor em tempo de desenvolvimento. \u00c9 chato e mata o dev de raiva? Sim. Mas esse &#8220;chato&#8221; j\u00e1 salvou muita madrugada inclusive o DBA agradece!!!!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cen\u00e1rio 5 &#8211; O assassino mais comum no dia a dia: fun\u00e7\u00e3o\/cast que transforma o tipo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Agora o caso que eu mais encontro em consultoria, filtrar um <code>TIMESTAMP<\/code> por dia, usando um cast para <code>date<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPLAIN ANALYZE\nSELECT count(*)\nFROM clientes\nWHERE criado_em::date = '2026-06-15';<\/code><\/pre>\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\/07\/image-9.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"189\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-9.png?resize=678%2C189&#038;ssl=1\" alt=\"\" class=\"wp-image-2475\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-9.png?resize=1024%2C286&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-9.png?resize=300%2C84&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-9.png?resize=768%2C214&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-9.png?w=1068&amp;ssl=1 1068w\" 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\/07\/image-11.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"295\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-11.png?resize=678%2C295&#038;ssl=1\" alt=\"\" class=\"wp-image-2477\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-11.png?resize=1024%2C446&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-11.png?resize=300%2C131&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-11.png?resize=768%2C335&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-11.png?w=1485&amp;ssl=1 1485w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/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\">Seq Scan, mesmo com \u00edndice em <code>criado_em<\/code>. Diferente do <code>varchar::text<\/code>, o cast <code>timestamp::date<\/code> <strong>n\u00e3o \u00e9 binary-coercible<\/strong> ele transforma o valor em outra coisa. O \u00edndice indexou <code>timestamp<\/code>s, a query pergunta sobre <code>date<\/code>. O planner n\u00e3o tem como usar o \u00edndice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A solu\u00e7\u00e3o cl\u00e1ssica (v\u00e1lida tamb\u00e9m no SQL Server) \u00e9 reescrever como intervalo, um predicado SARGable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WHERE criado_em >= '2026-06-15'\n  AND criado_em &lt;  '2026-06-16'\n<\/code><\/pre>\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\/07\/image-12.png?ssl=1\" rel=\"lightbox[2463]\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"177\" src=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-12.png?resize=678%2C177&#038;ssl=1\" alt=\"\" class=\"wp-image-2478\" srcset=\"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-12.png?resize=1024%2C267&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-12.png?resize=300%2C78&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-12.png?resize=768%2C200&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/image-12.png?w=1066&amp;ssl=1 1066w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Mas o PostgreSQL tem uma segunda sa\u00edda que o SQL Server n\u00e3o tem de forma t\u00e3o direta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-white-color\">PostgreSQL vs SQL Server: resumo das diferen\u00e7as<\/mark><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Comportamento<\/th><th>SQL Server<\/th><th>PostgreSQL<\/th><\/tr><\/thead><tbody><tr><td><code>VARCHAR<\/code> vs <code>NVARCHAR<\/code> \/ <code>TEXT<\/code><\/td><td>Converte implicitamente pela preced\u00eancia (<code>NVARCHAR<\/code> ganha) \u2192 coluna convertida \u2192 <strong>Index Scan<\/strong><\/td><td><code>VARCHAR<\/code> e <code>TEXT<\/code> s\u00e3o binary-coercible \u2192 <strong>\u00edndice funciona normalmente<\/strong><\/td><\/tr><tr><td>Coluna string vs literal num\u00e9rico<\/td><td>Converte a <strong>coluna<\/strong> silenciosamente \u2192 \u00edndice morre + risco de erro em runtime<\/td><td><strong>Erro imediato<\/strong>: <code>operator does not exist<\/code><\/td><\/tr><tr><td>Coluna <code>INT<\/code> vs par\u00e2metro <code>BIGINT<\/code><\/td><td>Converte a coluna (preced\u00eancia de tipos) \u2192 pode degradar<\/td><td>Operadores <em>cross-type<\/em> nativos \u2192 <strong>\u00edndice funciona<\/strong><\/td><\/tr><tr><td>Coluna <code>INT<\/code> vs literal\/par\u00e2metro <code>NUMERIC<\/code><\/td><td>Converte a coluna \u2192 degrada<\/td><td>Converte a coluna (<code>(id)::numeric<\/code>) \u2192 <strong>Seq Scan<\/strong><\/td><\/tr><tr><td>Aviso no plano<\/td><td><code>CONVERT_IMPLICIT<\/code> + warning no plano XML<\/td><td>Nenhum warning \u2014 voc\u00ea precisa <strong>ler o <code>Filter<\/code><\/strong> no <code>EXPLAIN<\/code><\/td><\/tr><tr><td>Indexar uma express\u00e3o<\/td><td>No SQL Server voc\u00ea <strong>n\u00e3o pode criar um \u00edndice diretamente sobre uma express\u00e3o<\/strong>.<br><br>A alternativa \u00e9 usar uma Computed Column.<\/td><td><strong>Expression Index nativo<\/strong>: <code>CREATE INDEX ON t ((expr))<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:#0693e3\" class=\"has-inline-color has-white-color\">Resumo<\/mark><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>A rigidez do Postgres protege<\/strong>, compara\u00e7\u00f5es de tipos incompat\u00edveis viram erro em desenvolvimento, n\u00e3o Seq Scan silencioso em produ\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong><code>::text<\/code> em coluna <code>varchar<\/code> n\u00e3o quebra \u00edndice<\/strong>, casts binary-coercible s\u00e3o gratuitos.<\/li>\n\n\n\n<li><strong>O \u00edndice morre quando a express\u00e3o muda o tipo, <\/strong> <code>int<\/code> vs <code>numeric<\/code>, <code>timestamp::date<\/code>, <code>lower()<\/code>, <code>json::jsonb<\/code>.<\/li>\n\n\n\n<li><strong>No Postgres n\u00e3o h\u00e1 warning de convers\u00e3o no plano<\/strong>, aprenda a ler o <code>Filter:<\/code> do <code>EXPLAIN ANALYZE<\/code>.<\/li>\n\n\n\n<li><strong>Expression Index \u00e9 o superpoder do PG<\/strong>, quando n\u00e3o d\u00e1 para mudar a query, indexe a express\u00e3o.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Gostou desse conteudo?<br>Ent\u00e3o continue nos acompanhando que sempre teremos novidades por aqui =D<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O resumo (excerpt) que sugeri no kit SEO:<\/p>\n<p>O blog agora tamb\u00e9m fala PostgreSQL! No primeiro post da s\u00e9rie SQL Server \u00d7 PostgreSQL, desmontamos um mito sobre casts, mostramos onde os \u00edndices morrem de verdade (com EXPLAIN ANALYZE em 100 mil linhas) e apresentamos a arma secreta do PG: o Expression Index.<\/p>\n<p>Se quiser varia\u00e7\u00f5es:<br \/>\nMais t\u00e9cnica, foco no achado:<\/p>\n<p>Nem todo cast quebra \u00edndice no PostgreSQL \u2014 e o que quebra de verdade quase ningu\u00e9m comenta. Neste post, com EXPLAIN ANALYZE real em 100 mil linhas, mostro por que codigo::text preserva o \u00edndice, por que id = 1003.0 gera Seq Scan 244\u00d7 mais lento, e como o Expression Index resolve casos onde a query n\u00e3o pode mudar. Tudo comparado com o comportamento equivalente no SQL Server.<\/p>\n","protected":false},"author":1,"featured_media":2481,"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":"O resumo (excerpt) que sugeri no kit SEO:\n\nO blog agora tamb\u00e9m fala PostgreSQL! No primeiro post da s\u00e9rie SQL Server \u00d7 PostgreSQL, desmontamos um mito sobre casts, mostramos onde os \u00edndices morrem de verdade (com EXPLAIN ANALYZE em 100 mil linhas) e apresentamos a arma secreta do PG: o Expression Index.\n\nSe quiser varia\u00e7\u00f5es:\nMais t\u00e9cnica, foco no achado:\nNem todo cast quebra \u00edndice no PostgreSQL \u2014 e o que quebra de verdade quase ningu\u00e9m comenta. Neste post, com EXPLAIN ANALYZE real em 100 mil linhas, mostro por que codigo::text preserva o \u00edndice, por que id = 1003.0 gera Seq Scan 244\u00d7 mais lento, e como o Expression Index resolve casos onde a query n\u00e3o pode mudar. Tudo comparado com o comportamento equivalente no SQL Server.","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"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":[689],"tags":[],"class_list":["post-2463","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/07\/og-conversao-implicita-postgresql-1200x630-1.png?fit=1200%2C630&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6eIyh-DJ","jetpack-related-posts":[{"id":2441,"url":"https:\/\/www.tiagoneves.net\/blog\/conversao-implicita-no-sql-server-o-vilao-invisivel-da-performance\/","url_meta":{"origin":2463,"position":0},"title":"Convers\u00e3o Impl\u00edcita no SQL Server: O Vil\u00e3o Invis\u00edvel da Performance","author":"tiagoneves","date":"2 de julho de 2026","format":false,"excerpt":"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\u2026","rel":"","context":"Em &quot;SQLServer Geral&quot;","block_context":{"text":"SQLServer Geral","link":"https:\/\/www.tiagoneves.net\/blog\/category\/sqlserver-geral\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2026\/06\/image.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":2216,"url":"https:\/\/www.tiagoneves.net\/blog\/como-tirei-a-certificacao-mcse-data-management-and-analytics\/","url_meta":{"origin":2463,"position":1},"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":1840,"url":"https:\/\/www.tiagoneves.net\/blog\/o-suporte-do-sql-server-2008-chegou-ao-fim-e-agora\/","url_meta":{"origin":2463,"position":2},"title":"O suporte do SQL Server 2008 chegou ao fim. E agora?","author":"tiagoneves","date":"11 de julho de 2019","format":false,"excerpt":"Ol\u00e1 pessoal, Existem datas que nunca acreditamos que vai chegar, ou s\u00e3o datas t\u00e3o, t\u00e3o, t\u00e3o distante que acabamos nos esquecendo e n\u00e3o nos preparamos para ela. Ent\u00e3o o dia 09 de Julho de 2019 chegou e com ele o fim do suporte do SQL Server 2008, voc\u00ea se preparou\u2026","rel":"","context":"Em &quot;SQL Server 2008&quot;","block_context":{"text":"SQL Server 2008","link":"https:\/\/www.tiagoneves.net\/blog\/category\/sql-server-2008\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/www.tiagoneves.net\/blog\/wp-content\/uploads\/2019\/03\/Risk.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1917,"url":"https:\/\/www.tiagoneves.net\/blog\/vem-ai-o-sql-saturday-vitoria\/","url_meta":{"origin":2463,"position":3},"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":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":2463,"position":4},"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":[]},{"id":1850,"url":"https:\/\/www.tiagoneves.net\/blog\/como-que-foi-o-13o-encontro-do-sql-server-es\/","url_meta":{"origin":2463,"position":5},"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":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2463","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=2463"}],"version-history":[{"count":4,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2463\/revisions"}],"predecessor-version":[{"id":2482,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/posts\/2463\/revisions\/2482"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media\/2481"}],"wp:attachment":[{"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/media?parent=2463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/categories?post=2463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tiagoneves.net\/blog\/wp-json\/wp\/v2\/tags?post=2463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}