Estou tentando entender melhor os tipos numéricos no SQL e li que o tipo decimal sempre exigirá 17 bytes. No entanto, o MS Docs lista uma tabela indicando a quantidade de espaço usado depende da precisão do decimal. Então eu tentei testá-lo usando a datalength
função.
create table tbl_TestDec(dec1 decimal(19,4), dec2 decimal(20,4), dec3 decimal(9,4))
insert into tbl_TestDec
select 1, 1, 1
select datalength(dec1), datalength(dec2), datalength(dec3) from tbl_TestDec
Isso produz:
5 5 5
Eu estava esperando um 9 13 5
ou outro 17 17 17
. Estou usando o SQL Server 2005. Todos os decimais são vardecimais ou estou entendendo mal a função de comprimento de dados?
DATALENGTH
retorna o tamanho (em bytes) da representação interna do valor passado para ela.Ele não retorna o tamanho de armazenamento necessário (que pode depender de onde você o armazena) nem retorna o tamanho máximo de dados que podem ser armazenados no tipo.
Por exemplo ( dbfiddle demo ):
dá:
Acho que você encontrará informações bastante interessantes sobre esse tópico em Reduzir o tamanho do banco de dados usando o formato de armazenamento Vardecimal , mas para responder à sua pergunta (citando o post, destacando o meu):
Tente inserir valores com maior precisão e seus resultados serão alterados.
Em outra nota:
Você pode habilitar o armazenamento Vardecimal no banco de dados e no nível da tabela. Usando o SSMS Object Explorer, você pode ver as opções do banco de dados e as propriedades de armazenamento de tabela para verificar se o armazenamento Vardecimal está ativado. Você também pode usar
sp_db_vardecimal_storage_format
, que observa:Dito isso, o armazenamento vardecimal somente para empresas foi preterido no SQL Server 2008 em favor da compactação de linha, que é um superconjunto de recursos de armazenamento vardecimal. A partir do SQL Server 2016 SP1, a compactação de dados de linha e página está disponível em todas as edições e não requer uma opção de configuração de banco de dados para usar.