Comparativo entre Varchar(14) e BigInt Uma das principais análises necessárias que devemos fazer antes de armazenar um dado dentro de uma table é verificar qual seria o melhor ou o mais indicado datatype para contêr o valor. Pensando nisso, um dos casos mais interessantes em relação á esta análise relaciona-se com o armazenamento de informações vinculadas ao CPF ou CNPJ. Como todos sabem o CNPJ é um Cadastro Nacional de Pessoa Jurídica existente no Brasil, este cadastro é composto basicamente por 14(quatorze) digitos numéricos. Justamente por esta quantidade de números um pouco acima do normal que se ínicia uma grande discussão. O que é melhor fazer armazenar armazenar estes valores em um datatype do tipo Varchar ou então utilizar o datatype BigInt. O datatype BigInt consiste em um tipo de dados utilizado para armazenar valores numéricos, com a capacidade de armazenamento de uma faixa de valores superior a suportada para datatype Int, a única desvantagem em relação ao Int e vinculada com o tamanho de espaço ocupado pelo BigInt que neste caso representa 8 bytes, sendo que, o Int ocupado no máximo 4 bytes. Por outro lado utilizar o datatype Varchar com o tamanho de 14 posições poderá facilitar o armazenamento destes dados, mas é claro somente os números, por outro estaremos proporcionando e até mesmo forçando uma possível alocação de dados um pouco maior que o BigInt. Outra consideração que devemos levar em conta, é que se for necessário realizar uma pesquisa sobre estes dados armazenados no Varchar, o SQL Server normalmente apresenta uma certa perda de performance na busca de dados armazenados em campos do tipo Char, VarChar, Nchar ou Nvarchar. Desta forma, decidi criar um pequeno laboratório para testes e tentarmos evidenciar o que seria melhor para uma pequena porção de dados armazenados em duas tabelas muito similares. Veja abaixo código de exemplo: --Criando a Table para armazenar o CNPJ em VarChar-Create Table TB_VarChar_CNPJ (Codigo Int Identity(1,1), CNPJ Varchar(14) Not Null) --Criando a Table para armazenar o CNPJ em BigInt-Create Table TB_BigInt_CNPJ (Codigo Int Identity(1,1), CNPJ BigInt Not Null) --Inserindo os dados-Insert Into TB_VarChar_CNPJ Values('1234567891234') Go 10 Insert Into TB_BigInt_CNPJ Values(1234567891234) Go 10 --Verificando os dados armazenados em ambas as tables-Select * from TB_VarChar_CNPJ Select * from TB_BigInt_CNPJ Vamos começar a análise através de uma verificação do espaço ocupado pelos dados inseridos em nossas tabelas. -- Verificando o espaço ocupado por cada table -sp_spaceused 'TB_VarChar_CNPJ' sp_spaceused 'TB_BigInt_CNPJ' Após realizar esta primeira análise o podemos identificar que não ocorreu nenhuma variação de espaço ocupado em cada table, mesmo utilizando tipos de dados diferentes. Agora vamos utilizar outra técnica para nossa comparação através do comando DBCC ShowContig. -- Obtendo informações estatísticas sobre a Table TB_VarChar_CNPJ -Através do comando DBCC ShowContig, temos a possibilidade de obter informações sobre as estatísticas de dados armazenados em uma tabela, seu área de dados armazenados por página, quantidade de espaço livre por página, entre muitas outras informações que podem fazer a diferença no momento de definir qual datatype poderá ser melhor. Dbcc ShowContig ("TB_VarChar_CNPJ") Observando o resultado da tabela TB_VarChar_CNPJ, podemos verificar que os dados armazenados no datatype Varchar estão ocupando 3.68% da densidade de dados alocados por página e a média de espaço livre por página é de 7796.0%. O próximo passo é executar o mesmo comando para a tabela TB_BigInt_CNPJ, conforme apresenta o código abaixo e demonstrado na Figura 5. --Obtendo informações estatísticas sobre a Table TB_BigInt_CNPJ-Dbcc ShowContig ("TB_BigInt_CNPJ") Por outro lado o resultado da tabela TB_BigInt_CNPJ mostrou uma diferença interessante de dados armazenados no datatype BigInt, ocupando 2.57% da densidade de dados alocados por página e a média de espaço livre de aproximadamente 7886.0% Com isso podemos dizer, que esta pequena quantidade de registros armazenados por cada table o datatype BigInt esta ocupando uma quantidade menor de espaço em nossa página de dados para cada registro. Mas se analisarmos toda a capacidade de armazenamento da página de dados, o BigInt esta alocando menos dados por cada linha de registros do que o Varchar(14). Essa análise nos indica que com o passar do tempo o datatype Varchar irá ocupar um pouco mais de espaço em cada página de dados que esta formando cada tabela, como também ira proporcionar uma alocação de mais registros por linha em cada página de dados um pouco maior que o BigInt. Sendo assim, vale a pena perder um pouco de espaço no armazenamento de dados utilizando o Varchar com uma quantidade pequena, com o passar do tempo e o aumento de registros armazenados por página. Você poderá ser beneficiado com a capacidade de alocar mais dados por cada linha de registro, diminuindo de foma considerável algum tipo de fragmentação de dados e possibilitando uma melhor ocupação da área de armazenaento de dados existente em cada página. Importante destacar que em nenhum momento esta análise tem por objetivo forçar o leitor a escolher o que supostamente foi apresentado com o resultados. Mas sim demonstrar algumas atividades que devemos realizar antes de escolher um tipo de dados que aparentemente é melhor.