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