AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 184288
Accepted
xr280xr
xr280xr
Asked: 2017-08-25 10:24:24 +0800 CST2017-08-25 10:24:24 +0800 CST 2017-08-25 10:24:24 +0800 CST

Por que o comprimento de dados do decimal 5 é independente da precisão?

  • 772

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 datalengthfunçã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 5ou 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?

sql-server sql-server-2005
  • 2 2 respostas
  • 988 Views

2 respostas

  • Voted
  1. Paul White
    2017-08-25T22:34:43+08:002017-08-25T22:34:43+08:00

    DATALENGTHretorna 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 ):

    SELECT
        N.d, 
        AsBinary = CONVERT(varbinary(20), N.d),
        DataLengthVarBin = DATALENGTH(CONVERT(varbinary(20), N.d)),
        DataLengthDec38 = DATALENGTH(N.d) 
    FROM 
    (
        SELECT 
            CONVERT(
                decimal(38, 38), 
                '0.' + 
                REPLICATE('0', 38 - SV.number) + 
                REPLICATE('1', SV.number))
        FROM master.dbo.spt_values AS SV
        WHERE [SV].[type] = N'P'
        AND SV.number BETWEEN 1 AND 38
    ) AS N (d);
    

    dá:

    +------------------------------------------+------ -----------------------+----------- -------+-----------------+
    | d | AsBinário | DataLengthVarBin | DataLengthDec38 |
    +------------------------------------------+------ -----------------------+----------- -------+-----------------+
    | 0,0000000000000000000000000000000000001 | 0x2626000101000000 | 8 | 5 |
    | 0,00000000000000000000000000000000000011 | 0x262600010B000000 | 8 | 5 |
    | 0,00000000000000000000000000000000000111 | 0x262600016F000000 | 8 | 5 |
    | 0,0000000000000000000000000000000001111 | 0x2626000157040000 | 8 | 5 |
    | 0,00000000000000000000000000000000011111 | 0x26260001672B0000 | 8 | 5 |
    | 0,0000000000000000000000000000000111111 | 0x2626000107B20100 | 8 | 5 |
    | 0,00000000000000000000000000000001111111 | 0x2626000147F41000 | 8 | 5 |
    | 0,0000000000000000000000000000011111111 | 0x26260001C78AA900 | 8 | 5 |
    | 0,00000000000000000000000000000111111111 | 0x26260001C76B9F06 | 8 | 5 |
    | 0,00000000000000000000000000001111111111 | 0x26260001C7353A42 | 8 | 5 |
    | 0,00000000000000000000000000011111111111 | 0x26260001C719469602000000 | 12 | 9 |
    | 0,00000000000000000000000000111111111111 | 0x26260001C701BDDE19000000 | 12 | 9 |
    | 0,00000000000000000000000001111111111111 | 0x26260001C71162B302010000 | 12 | 9 |
    | 0,00000000000000000000000011111111111111 | 0x26260001C7B1D4011B0A0000 | 12 | 9 |
    | 0,00000000000000000000000111111111111111 | 0x26260001C7F14E120E650000 | 12 | 9 |
    | 0,00000000000000000000001111111111111111 | 0x26260001C77115B78CF20300 | 12 | 9 |
    | 0,00000000000000000000011111111111111111 | 0x26260001C771D6267F792700 | 12 | 9 |
    | 0,00000000000000000000111111111111111111 | 0x26260001C7716084F7BE8A01 | 12 | 9 |
    | 0,00000000000000000001111111111111111111 | 0x26260001C771C42BAB756B0F | 12 | 9 |
    | 0,00000000000000000011111111111111111111 | 0x26260001C771ACB5AF98329A | 12 | 9 |
    | 0,00000000000000000111111111111111111111 | 0x26260001C771BC18DDF6F90506000000 | 16 | 13 |
    | 0,00000000000000001111111111111111111111 | 0x26260001C7715CF7A2A4C33B3C000000 | 16 | 13 |
    | 0,00000000000000011111111111111111111111 | 0x26260001C7719CA95D6EA4555A020000 | 16 | 13 |
    | 0,00000000000000111111111111111111111111 | 0x26260001C7711CA0A84F6C5887170000 | 16 | 13 |
    | 0,0000000000000111111111111111111111111 | 0x26260001C7711C41961C3B7449EB0000 | 16 | 13 |
    | 0,0000000000001111111111111111111111111 | 0x26260001C7711C8BDE1D4F8ADE300900 | 16 | 13 |
    | 0,0000000000011111111111111111111111111 | 0x26260001C7711C6FB12A1767B1E85B00 | 16 | 13 |
    | 0,0000000000111111111111111111111111111 | 0x26260001C7711C57EEAAE706EE169703 | 16 | 13 |
    | 0,0000000001111111111111111111111111111 | 0x26260001C7711C674FAD0C454CE5E623 | 16 | 13 |
    | 0,0000000011111111111111111111111111111 | 0x26260001C7711C071AC57EB2FAF4046701000000 | 20 | 17 |
    | 0,0000000111111111111111111111111111111 | 0x26260001C7711C4704B3F3F8CA9131060E000000 | 20 | 17 |
    | 0,0000001111111111111111111111111111111 | 0x26260001C7711CC72AFE84B9EDB1EF3D8C000000 | 20 | 17 |
    | 0,0000011111111111111111111111111111111 | 0x26260001C7711CC7ABED313F49F35C6B7A050000 | 20 | 17 |
    | 0,0000111111111111111111111111111111111 | 0x26260001C7711CC7B548F377DC80A131C8360000 | 20 | 17 |
    | 0.0001111111111111111111111111111111111 | 0x26260001C7711CC719D780AF9C084FF0D1230200 | 20 | 17 |
    | 0,0011111111111111111111111111111111111 | 0x26260001C7711CC7016708DB1E56166333661500 | 20 | 17 |
    | 0,0111111111111111111111111111111111111 | 0x26260001C7711CC71106548E345DDFDE01FED500 | 20 | 17 |
    | 0,1111111111111111111111111111111111111 | 0x26260001C7711CC7B13C488F0DA4B9B412EC5B08 | 20 | 17 |
    +------------------------------------------+------ -----------------------+----------- -------+-----------------+
    • 13
  2. Best Answer
    Scott Hodgin - Retired
    2017-08-25T10:50:17+08:002017-08-25T10:50:17+08:00

    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):

    O tamanho do armazenamento depende da precisão declarada da coluna E do valor. Por exemplo, se você tiver uma coluna decimal declarada com precisão de 18 e o valor comum para essa coluna tiver apenas 3 dígitos, o SQL Server usará apenas 5 bytes, o que é quase 50% menor que os 9 bytes usados ​​pelo formato fixo. Mas, se o valor comum da coluna tiver 18 dígitos, o SQL Server usará 11 bytes, que é 20% a mais que o tamanho correspondente no formato de comprimento fixo.

    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:

    Retorna o estado atual do formato de armazenamento vardecimal de um banco de dados ou habilita um banco de dados para o formato de armazenamento vardecimal. A partir do SQL Server 2008, os bancos de dados do usuário estão sempre habilitados. Habilitar bancos de dados para o formato de armazenamento vardecimal só é necessário no SQL Server 2005.

    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.

    • 6

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve