PostgreSQL

CHAR para VARCHAR

Há muito tempo, em uma galáxia muito, muito distante… lá na era do COBOL, os dados eram armazenados de forma tabular e os dados eram armazenados em uma tabela onde cada coluna ocupava espaços fixos nessa tabela. Assim, o CEP ocupava a posição de 1 a 7, o número de 8 a 12, o logradouro de 13 a 33 e assim por diante. Quando criaram os bancos de dados relacionais foram criados, criaram tipos de dados para strings com tamanho fixo que funcionam de forma semelhante, o CHAR. Infelizmenteo CHAR armazena desnecessariamente espaços em branco e foi substituido posteriormente pelo VARCHAR que são strings com tamanho variável bem mais flexível e se tornou padrão.
Por motivos que não vem ao caso, muita gente ainda usa CHAR em bancos de dados. Vou demonstrar aqui de forma simples, como converter numa simples tabela um campo CHAR para VARCHAR pode economizar imediatamente 40% do espaço da tabela:

Como se vê, a tabela, mesmo sem índices, caiu de 135MB para 83MB. Agora eu montei um script rápido para listar as tabelas com colunas do tipo CHAR:

Por fim, montei um script para alterar todos os campos CHAR para VARCHAR, tomando o cuidado para alterar vários campos num único ALTER TABLE para não ter que reescrever tabelas mais de uma vez:

Vale a recomendação: teste antes de usar isso em produção!

One Comment

  • Muito bem observado, Fábio! Me admira que alguns softwares comerciais de grandes corporações usam o PostgreSQL e outros SGBDR adotando o CHAR como tipo global para todas as colunas com texto/strings. Mas, apesar de eu nunca ter feito um teste apropriado, percebo que na maioria dos casos o uso de CHAR oferece um pouco mais de desempenho em relação a VARCHAR. Seria isto efeito placebo “positivista” ou realmente o fato da compressão/TOAST implica em perdas de desempenho? Em sua extensa trajetória profissional, já chegou a testar isso?

Leave a Reply

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.