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 / 169254
Accepted
ajeh
ajeh
Asked: 2017-04-06 13:49:01 +0800 CST2017-04-06 13:49:01 +0800 CST 2017-04-06 13:49:01 +0800 CST

A tentativa de compactar uma tabela existente não altera o tamanho da tabela

  • 772

Há uma tabela existente no SQL 2012 Enterprise DB, que tem aproximadamente 120 MB de tamanho com aproximadamente 2.000 registros. Seu maior campo nvarchar(max)contém XML esponjoso (variando de 20 a 300 kB) que por si só compacta aproximadamente 50-75% em 7Zip ou RAR.

Eu tentei os seguintes comandos que retornam instantaneamente, mesmo que simplesmente consultar * da tabela leve alguns segundos:

alter table sch.table1 REBUILD PARTITION=ALL WITH (DATA_COMPRESSION=ROW)
alter table sch.table1 REBUILD PARTITION=ALL WITH (DATA_COMPRESSION=PAGE)
alter table sch.table1 REBUILD PARTITION=ALL WITH (DATA_COMPRESSION=NONE)

Mas o tamanho não muda após nenhum deles, mesmo que as propriedades da tabela mostrem corretamente o tipo de compactação.

O servidor está realmente aplicando e removendo a compactação das linhas/páginas? Aparentemente, não tem tempo para fazer isso na fração de segundo que cada comando leva para ser executado.

sql-server compression
  • 1 1 respostas
  • 1873 Views

1 respostas

  • Voted
  1. Best Answer
    Joe Obbish
    2017-04-06T17:09:27+08:002017-04-06T17:09:27+08:00

    A compactação de linha e a compactação de página têm várias limitações e nem sempre reduzem o espaço usado por sua tabela. Vamos percorrer um exemplo simples. Suponha que eu insira um monte de strings de comprimento 4030 em uma tabela. A aplicação da compactação de página resulta em uma redução de espaço de 4.000 KB para 24 KB:

    CREATE TABLE dbo.ZZZZZ_CI (
    ID INT NOT NULL IDENTITY (1, 1),
    FLUFF VARCHAR(4050),
    PRIMARY KEY (ID)
    );
    
    SET NOCOUNT ON;
    
    GO
    -- insert 1000 rows
    INSERT INTO dbo.ZZZZZ_CI VALUES (REPLICATE('Z', 4030));
    GO 1000
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI'; -- 4000 KB for data
    
    ALTER TABLE dbo.ZZZZZ_CI REBUILD WITH (DATA_COMPRESSION=PAGE);
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI'; -- now 24 KB for data
    

    No entanto, se eu inserir strings de comprimento 4050, não obtenho economia de espaço com a compactação de página, mesmo que as strings sejam todas do mesmo caractere!

    -- remove data and compression
    TRUNCATE TABLE dbo.ZZZZZ_CI;
    ALTER TABLE dbo.ZZZZZ_CI REBUILD WITH (DATA_COMPRESSION=NONE);
    
    GO
    -- insert 1000 rows
    INSERT INTO dbo.ZZZZZ_CI VALUES (REPLICATE('Z', 4050));
    GO 1000
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI'; -- 8000 KB for data
    
    ALTER TABLE dbo.ZZZZZ_CI REBUILD WITH (DATA_COMPRESSION=PAGE);
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI'; -- still 8000 KB for data
    

    Para sua mesa, você provavelmente está enfrentando uma limitação diferente. Uma tabela no SQL Server pode conter apenas 8060 bytes por linha . Quaisquer dados que não couberem são armazenados separadamente como arquivos ROW_OVERFLOW_DATA. O tamanho médio da linha é de cerca de 64 KB e o tamanho mínimo da linha é de 20 KB. Isso significa que todos os seus dados XML não podem ser armazenados em linha. A compactação de dados não funciona em dados armazenados fora da linha :

    O SQL Server compacta dados LOB na linha, mas não se os dados LOB estiverem armazenados fora da linha. Como resultado, muitos aplicativos pesados ​​de LOB não conseguem tirar o máximo proveito da compactação de dados. No entanto, existem duas soluções alternativas disponíveis. Primeiro, os dados LOB podem ser compactados na camada do aplicativo, mas isso significa que (a) o aplicativo precisa ser modificado (b) o aplicativo não pode aproveitar os recursos de pesquisa e atualização parcial fornecidos no SQL Engine. Segundo, use o recurso de fluxo de arquivos para armazenar dados LOB em um volume compactado. Esta é a nossa solução recomendada quando aplicável. Consulte Books-Online para obter detalhes sobre o recurso de fluxo de arquivos.

    Ambas as soluções alternativas estão disponíveis no SQL Server 2012. No SQL Server 2016, há uma opção adicional com a introdução do GZIP . Isso pode compactar dados que, de outra forma, seriam armazenados fora da linha. Os dados anteriores não podiam ser compactados por página, mas o GZIP reduz o espaço necessário para 64 KB:

    CREATE TABLE dbo.ZZZZZ_CI_2016 (
    ID INT NOT NULL IDENTITY (1, 1),
    FLUFF_COMPRESSED varbinary(max),
    PRIMARY KEY (ID)
    );
    
    GO
    -- insert 1000 compressed rows
    INSERT INTO dbo.ZZZZZ_CI_2016 VALUES (COMPRESS(REPLICATE('Z', 4050)));
    GO 1000
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI_2016';  -- now 64 KB for data
    
    SELECT COUNT(*) -- 1000 is returned
    FROM ZZZZZ_CI_2016
    WHERE DECOMPRESS(FLUFF_COMPRESSED) = REPLICATE('Z', 4050);
    

    Mesmo strings muito longas podem ser bem compactadas:

    TRUNCATE TABLE dbo.ZZZZZ_CI_2016;
    
    GO
    -- insert 1000 compressed rows
    INSERT INTO dbo.ZZZZZ_CI_2016 VALUES (COMPRESS(REPLICATE(CAST('Z' AS VARCHAR(MAX)), 99999)));
    GO 1000
    
    EXEC sp_spaceused 'dbo.ZZZZZ_CI_2016';  -- now 152 KB for for 99999 length strings
    
    • 9

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • 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

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