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 / 172252
Accepted
Henrik Staun Poulsen
Henrik Staun Poulsen
Asked: 2017-04-29 03:23:36 +0800 CST2017-04-29 03:23:36 +0800 CST 2017-04-29 03:23:36 +0800 CST

Qual é a sobrecarga de linha ao usar a compactação de página?

  • 772

Eu criei uma tabela com 650 colunas Numeric(19,4). Quando ligo a compactação de página, executando

ALTER TABLE fct.MyTable REBUILD  WITH (DATA_COMPRESSION = PAGE);

eu recebo

Msg 1975, Level 16, State 1
Index O comprimento da linha 'PK_Mytable' excede o comprimento máximo permitido de '8060' bytes.

mas 650 vezes 9 bytes são apenas 5850 bytes, o que está bem longe do limite declarado de 8060 bytes.

O servidor está executando o Windows 2012 r2 com SQL Server 2016 SP1 CU2

Qual é a sobrecarga de linha ao usar a compactação de página?

Aqui está algum código para mostrar o que quero dizer:

/* test script to demo MSG 1975 */
DECLARE @sql NVARCHAR(max)='', @i INT =0
drop table if exists dbo.mytable;

SET @sql = 'Create table dbo.Mytable (MyTableID bigint not null 
  identity(1,1) primary key clustered, '

WHILE @i < 593 BEGIN
    SET @sql += ' Column' + LTRIM(@i) + ' numeric(19,4) null, '
    SET @i +=1
END

SET @sql += ' LastColumn int) '
--SET @sql += ' with (DATA_COMPRESSION = ROW) '
SET @sql += ' with (DATA_COMPRESSION = PAGE) '

SELECT @sql
EXEC sys.sp_executesql @sql

SELECT top 10000 * FROM dbo.MyTable MT

A compactação de linhas também falha, mas em uma contagem de linhas diferente.

sql-server-2016 compression
  • 1 1 respostas
  • 1598 Views

1 respostas

  • Voted
  1. Best Answer
    AMtwo
    2017-04-29T05:04:16+08:002017-04-29T05:04:16+08:00

    Se você tentar criar sua tabela sem a restrição de PK clusterizada, receberá um erro um pouco diferente:

    Msg 1701, Level 16, State 1, Line 1 Falha ao criar ou alterar a tabela 'Mytable' porque o tamanho mínimo da linha seria 8067, incluindo 1530 bytes de sobrecarga interna. Isso excede o tamanho máximo permitido da linha da tabela de 8060 bytes.

    Nesta mensagem de erro, você pode ver que há 1530 bytes de sobrecarga interna para compactação de página.

    Agora você pode fazer as contas:

    • 8 bytes para bigintMyTableID
    • 4 bytes para intLastColumn
    • 9 bytes para cada uma das 593 numeric(19,4)colunas (total de 5337 bytes)
    • 1530 bytes de sobrecarga de compactação

    Então, 8 + 4 + (593*9) + 1530 = 6879. Espere um segundo... Isso ainda está abaixo de 8060. O que há com isso?!


    O algoritmo de compactação de página, na verdade, empilha vários algoritmos de compactação juntos. O primeiro passo é aplicar a compressão ROW. A sobrecarga de compactação de linha não está incluída nos 1530 bytes de sobrecarga listados nessa mensagem de erro.

    Você pode ler mais sobre como a compactação de linhas funciona aqui no meu blog e aqui no BOL . Você notará no artigo BOL que ele descreve o numericarmazenamento como "Este armazenamento é exatamente o mesmo que o formato de armazenamento vardecimal", mas não explica vardecimal. Este post cobre vardecimalum pouco mais - essencialmente, ele adiciona 2 bytes de sobrecarga por coluna para armazenar o comprimento real (semelhante ao que varcharfaz).

    A compactação de linha exigirá 2 bytes adicionais para cada uma das 593 numericcolunas, mais o biginte intexigirá 1 byte de sobrecarga cada.

    Os requisitos de armazenamento compactado por linha seriam:

    • 8 bytes + 1 byte de sobrecarga para bigintMyTableID
    • 4 bytes + 1 byte de sobrecarga para intLastColumn
    • 9 bytes + 2 bytes de sobrecarga para cada uma das 593 numeric(19,4)colunas
    • 1188 bytes de sobrecarga de compactação ROW

    8 + 4 + (593*9) = 5349 bytes de dados

    1 + 1 + (593*2) = sobrecarga de compactação de linha de 1188 bytes

    Total de 6.537 bytes para esquema compactado por linha


    Agora que temos o tamanho da linha para o esquema compactado por linha, podemos revisitar nossa matemática. O tamanho da linha compactada de página será o tamanho dos dados + sobrecarga de compactação de linha + sobrecarga de compactação de página:

    • 8 bytes para bigintMyTableID
    • 4 bytes para intLastColumn
    • 9 bytes para cada uma das 593 numeric(19,4)colunas
    • 1188 bytes de sobrecarga de compactação ROW
    • 1530 bytes de sobrecarga de compactação PAGE
      dados de 5349 bytes
    + 1188 bytes de sobrecarga de compactação de linha
    + 1530 bytes de sobrecarga de compactação de página
    

    total de 8067 bytes

    • 13

relate perguntas

  • Script T-SQL para executar um backup compactado com nível máximo de compactação [duplicado]

  • As colunas de string com poucas entradas diferentes são compactadas automaticamente?

  • Qual é a maneira mais eficaz de compactar e armazenar um backup do SQL Server? [fechado]

  • Os dados recuperados do SQL Server são compactados para transmissão?

  • SQL 2008 Merge Replication e compactação de dados em nível de tabela

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