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



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