SQL Server 2012: DMF não documentada

Olá pessoal,

Venho falando de DMV’s e DMF’s a um longo tempo como você mesmo pode ver aqui e aqui. Hoje vou falar de uma nova DMF presente no SQL Server 2012 que visa substituir acredito eu o comando também não documentado DBCC IND.

A DMF em questão é a sys.dm_db_database_page_allocations essa nova DMF traz para nós algumas informações novas e é claro ser muito mais fácil de manipular do que o comando anterior. Sem mais delongas vou demonstrar a vocês quais as informações podemos capturar.

Vamos utilizar alguns scripts.

use master
go
if exists (select name from sys.databases where name  = ‘PageAllocations’)
begin
drop database PageAllocations
end
go
create database PageAllocations
go
use PageAllocations
go
create table tblAlloc1(id int identity, nome char(8000))
go
create table tblAlloc2(id int identity not null primary key, nome char(8000))
go

insert into tblAlloc1
values (‘Marcos’)
go 2
insert into tblAlloc2
values (‘Marcos Freccia’)
go 7

Feito esses dois inserts, vamos demonstrar o comportamento dessa DMF para a primeira tabela.

select allocation_unit_type_desc,extent_file_id,extent_page_id,is_iam_page,
is_allocated,allocated_page_page_id,is_mixed_page_allocation,page_type_desc,
next_page_page_id,previous_page_page_id,is_page_compressed,has_ghost_records
from sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(‘tblAlloc1′),null,null,’DETAILED’)

image

Quais as informações podemos tirar daqui?

  • A qual extent nossas paginas de dados estão atreladas
  • Qual é a nossa pagina de dados IAM.
  • Se a pagina esta alocado com dados ou apenas disponível.
  • Em qual arquivo está meu extent
  • É extent misto ou extent uniforme?
  • Essa pagina de dados está passando ou não por um delete, através do campo has_ghost_records.
  • Qual o tipo de pagina estamos vendo.

Como podem ver temos inúmeras informações valiosas através dessa consulta, mas acredito eu uma coisa vocês devem ter notado. Porque os campos next_page_page_id e previous_page_page_id estão nulos?

A resposta para isso é bastante simples. HEAP TABLE !!!

É pessoal com uma heap table não temos os links de referencia entre uma pagina e outra por isso os campos nulos, a única coisa que faz o mapeamento dessa tabela é o id do extent.

Vamos ao proximo exemplo.

select allocation_unit_type_desc,extent_file_id,extent_page_id,is_iam_page,
is_allocated,allocated_page_page_id,is_mixed_page_allocation,page_type_desc,
next_page_page_id,previous_page_page_id,is_page_compressed,has_ghost_records
from sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(‘tblAlloc2′),null,null,’DETAILED’)

image

Como voces podem ver passamos a ter mais informações, agora de quais são as paginas predecessoras e sucessoras a cada uma. Outro ponto legal que podemos ver é que com a adição de um indice na nossa tabela conseguimos ver também qual é a pagina de dados correspondente a uma pagina de indice.

Apenas por curiosidade vamos adicionar mais dois registros a nossa tabela tblAlloc2.

insert into tblAlloc2
values (‘Marcos Freccia’)
go 2

realizamos a mesma consulta e obtemos o seguinte resultado.

image

Perai.. mas como assim 17 registros se eu inseri apenas dois na minha tabela??

Vocês nao estão loucos e o SQL Server não está mostrando nada errado, esse comportamento acontece cada vez que prenchemos  nossas 8 paginas de dados de um extent misto. O SQL Server automaticamente já aloca mais 8 paginas (1 extent = 8 paginas de 8KB) e agora já passamos a ter não mais extents mistos, mas sim uniformes.

Uma lição que podemos tirar daqui então é que o SQL Server sempre irá alocar de primeiro ponto um extent misto e não uniforme.

Pessoal por hoje era isso, espero que tenham gostado dessa nova DMF.

Abraços,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

Sobre Marcos Freccia

MVP em SQL Server (Data Plataform) , especialista em SQL Server, e atualmente trabalhando com Microsoft Azure!

Publicado em junho 25, 2012, em Administração, DMF, SQL Server 2012, VirtualPass e marcado como , , . Adicione o link aos favoritos. 2 Comentários.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: