none
Char e VarChar RRS feed

  • Pergunta

  • tenho uma tabela com 1 milhão de registros

    tenho um campo   nome char(100)

    passei para varchar(100)

    a questão é, o tamanho do mdf não deveria ter diminuido

    já que 60% do campo nome preechem apenas 60 caracteres

    quinta-feira, 15 de agosto de 2013 11:28

Respostas

  • Erial, concordo plenamente com a resposta do Fabrizzio, só veja se é realmente necessario fazer o shrink pois com o tempo a base vai voltar a este tamanho e o uso do shrink pode causar fragmentação do disco.

    Respondendo a sua ultima pergunta quando um tipo de campo de string não tiver um tamanho padrão por exemplo nome o ideal é cria-lo como varchar, agora por exemplo caso seja a sigla de um estado o ideal é cria-lo como char(2) pois este tamanho nunca vai mudar.


    Alexandre Matayosi Conde Mauricio.

    • Marcado como Resposta erial quinta-feira, 15 de agosto de 2013 13:26
    quinta-feira, 15 de agosto de 2013 12:29

Todas as Respostas

  • Erial,

    Sim e não rs...Bom, explicando melhor...

    O que irá diminuir é o tamanho bruto de sua tabela, coisa que pode ser visualizada através deste código abaixo. Então, sim, a sua tabela diminuiu e consequentemente seu MDF tambem está menor no disco, ao menos na parte efetivamente usada.

    --Table creation
    IF(OBJECT_ID('TabelaCharVarchar') IS NOT NULL)
    	DROP TABLE TabelaCharVarchar
    	
    CREATE TABLE TabelaCharVarchar
    (
    	Nome CHAR(100)
    )
    GO
    
    --Data load
    INSERT INTO TabelaCharVarchar
    SELECT REPLICATE('a', 60)
    GO 5000
    
    --Table size with CHAR
    EXEC sp_spaceused 'TabelaCharVarchar'
    /*
    name				rows		reserved	data	index_size	unused
    TabelaCharVarchar	5000       	584 KB		568 KB	8 KB		8 KB
    */
    
    --Alter to VARCHAR
    ALTER TABLE TabelaCharVarchar ALTER COLUMN Nome VARCHAR(100)
    
    --Table size with VARCHAR
    EXEC sp_spaceused 'TabelaCharVarchar'
    /*
    name				rows		reserved	data	index_size	unused
    TabelaCharVarchar	5000       	1160 KB		1128 KB	8 KB		24 KB
    */

    Porem o SQL Server trabalha com espaço em disco alocado mas não utilizado, isso faz com que possa crescer sem realizar uma das operações mais custosas para o DbEngine, que é justamente a reserva de espaço em disco.

    Para que o espaço não mais utilizado pela alteração do CHAR para VARCHAR seja liberado para o sistema operacional e não seja mais visto no MDF, fazendo com que efetivamente seu arquivo MDF em disco reduza basta realizar um Shrink da base de dados, mas lembrando, com isso voce perderá performance caso sua base precise crescer novamente devido a utilização.


    <b>Fabrizzio A. Caputo</b><br/> Certificações:<br/> MCT<br/> MCC<br/> Oracle OCA 11g<br/> MCITP SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer<br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com

    quinta-feira, 15 de agosto de 2013 11:54
    Moderador
  • então o ideal já é cria o campo varchar na criação da tabela
    quinta-feira, 15 de agosto de 2013 11:58
  • Erial, concordo plenamente com a resposta do Fabrizzio, só veja se é realmente necessario fazer o shrink pois com o tempo a base vai voltar a este tamanho e o uso do shrink pode causar fragmentação do disco.

    Respondendo a sua ultima pergunta quando um tipo de campo de string não tiver um tamanho padrão por exemplo nome o ideal é cria-lo como varchar, agora por exemplo caso seja a sigla de um estado o ideal é cria-lo como char(2) pois este tamanho nunca vai mudar.


    Alexandre Matayosi Conde Mauricio.

    • Marcado como Resposta erial quinta-feira, 15 de agosto de 2013 13:26
    quinta-feira, 15 de agosto de 2013 12:29