Desafio #1 – Data Compression Labs


Books

Oi,

Antes de começar o próximo post do Compression Labs, tenho um pequeno e humilde desafio pra quem se interessar a responder (e eu até poderia dizer que estou fazendo isso pra ganhar  tempo fazendo de fazer um post direito, mas estaria sendo estupidamente honesto)…Vamos utilizar o script do Compression Labs #1 adaptado para montar o cenário: vamos criar desta vez duas tabelas, sendo que uma delas vai levar compressão de página.

Os testes foram realizados no SQL Server 2008 R2 Enterprise, mas valem também 2012 e 2014 Enterprise e similares (aka Developer e Evaluation).

 

USE MASTER

GO

IF EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME LIKE '%DComp%')
BEGIN

ALTER DATABASE DComp SET RESTRICTED_USER;
DROP DATABASE  DComp;

END

GO

CREATE DATABASE DComp
GO

USE DComp
GO

CREATE TABLE dbo.Pessoa
(
ID INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
NOME VARCHAR(50) NULL DEFAULT 'Nome de alguém',
DESCRICAO CHAR(8000) NULL DEFAULT REPLICATE('A',8000),
IDADE INT NULL
);

INSERT INTO DBO.PESSOA (NOME, DESCRICAO, IDADE) VALUES ('Quico','Realizando o teste da compressão',9);
INSERT INTO DBO.PESSOA (NOME, DESCRICAO, IDADE) VALUES ('Seu Madruga','Realizando o teste da compressão',50);
INSERT INTO DBO.PESSOA (NOME, DESCRICAO, IDADE) VALUES ('Chaves','Realizando o teste da compressão',8);
INSERT INTO DBO.PESSOA (NOME, DESCRICAO, IDADE) VALUES ('Chiquinha','Realizando o teste da compressão',7);
INSERT INTO DBO.PESSOA (NOME, DESCRICAO, IDADE) VALUES ('Bruxa do 71','Realizando o teste da compressão',50);

CREATE TABLE dbo.Pessoa2
(
ID INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
NOME VARCHAR(50) NULL DEFAULT 'Nome de alguém',
DESCRICAO CHAR(8000) NULL DEFAULT REPLICATE('A',8000),
IDADE INT NULL
);

INSERT INTO DBO.PESSOA2 (NOME, DESCRICAO, IDADE) VALUES ('Quico','Realizando o teste da compressão',9);
INSERT INTO DBO.PESSOA2 (NOME, DESCRICAO, IDADE) VALUES ('Seu Madruga','Realizando o teste da compressão',50);
INSERT INTO DBO.PESSOA2 (NOME, DESCRICAO, IDADE) VALUES ('Chaves','Realizando o teste da compressão',8);
INSERT INTO DBO.PESSOA2 (NOME, DESCRICAO, IDADE) VALUES ('Chiquinha','Realizando o teste da compressão',7);
INSERT INTO DBO.PESSOA2 (NOME, DESCRICAO, IDADE) VALUES ('Bruxa do 71','Realizando o teste da compressão',50);

ALTER TABLE dbo.Pessoa2 REBUILD WITH (DATA_COMPRESSION=PAGE);

Tem uma DMF  bem interessante que verifica as propriedades físicas de um índice, a sys.dm_db_index_physical_stats, o que inclui não apenas informações sobre fragmentação, mas também sobre quantidade de páginas, e pra ser mais específico, também nos informa a quantidade de páginas comprimidas, através da coluna compressed_page_count. Segue informações do BOL.

Compressed1

Sabemos que a DMF possui três modos: LIMITED, SAMPLED E DETAILED. Vamos usar DETAILED pra apresentar algumas informações bem específicas dos índices, das duas tabelas.

Segue consulta:


SELECT
OBJECT_NAME(object_id) AS [Tabela],
INDEX_ID as indid,
INDEX_TYPE_DESC,
INDEX_DEPTH,
INDEX_LEVEL,
AVG_FRAGMENTATION_IN_PERCENT as [AVG_FRAG_IN_%],
PAGE_COUNT AS [PAGES],
AVG_PAGE_SPACE_USED_IN_PERCENT as [AVG_PAGE_SPACE_USED_IN_%],
RECORD_COUNT as [RECORDS],
-- MIN_RECORD_SIZE_IN_BYTES,
MAX_RECORD_SIZE_IN_BYTES,
-- AVG_RECORD_SIZE_IN_BYTES,
COMPRESSED_PAGE_COUNT

FROM sys.dm_db_index_physical_stats
(DB_ID(), null, NULL, NULL , 'DETAILED')
WHERE OBJECT_NAME(OBJECT_ID) IN ('Pessoa','Pessoa2')

Resultado:

ResultadoIndex

As perguntas:

1) Se nossa tabela é um índice cluster, porque temos apenas dois níveis na tabela Pessoa, e, mais estranho ainda, um nível na tabela Pessoa2? Que b+tree é essa que não tem raíz, nível intermediário e folha?

2)Porque a compression_page_count não retorna absolutamente nada pra tabela Pessoa2 sendo que temos página comprimida?

As perguntas não são difíceis (principalmente a primeira), mas também não estão “de graça” (acho, rs).
Desafio lançado está e até a próxima.

[]’s


One response to “Desafio #1 – Data Compression Labs”

  1. Respostas:

    1) Porque o número de páginas não é suficiente para justificar a geração de estrutura B+Tree
    2) Porque temos apenas uma página comprimida porém ainda em uso , não contando para o campo em questão. A contagem certa seria count(compressed_pages) – 1. Quem sabe faço testes em outros posts…
    []’s

Leave a Reply

Your email address will not be published. Required fields are marked *