Estou tentando entender as divisões de página no SQL Server, lendo O QUE É UMA DIVISÃO DE PÁGINA? O QUE ACONTECE? POR QUE ACONTECE? POR QUE SE PREOCUPAR? por Tony Rogerson
CREATE TABLE mytest
(
something_to_see_in_data CHAR(5) NOT NULL CONSTRAINT pk_mytest PRIMARY KEY CLUSTERED,
filler VARCHAR(3000) NOT NULL
)
go
insert mytest ( something_to_see_in_data, filler ) values( '00001', replicate( 'A', 3000 ) )
insert mytest ( something_to_see_in_data, filler ) values( '00002', replicate( 'B', 1000 ) )
insert mytest ( something_to_see_in_data, filler ) values( '00003', replicate( 'C', 3000 ) )
go
Para verificar as páginas da minha tabela:
DBCC IND ( 0, 'mytest', 1);
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
| PageFID | PagePID | IAMFID | IAMPID | ObjectID | IndexID | PartitionNumber | PartitionID | iam_chain_type | PageType | IndexLevel |
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
| 1 | 3520 | NULL | NULL | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 10 | NULL |
| 1 | 3519 | 1 | 3520 | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 1 | 0 |
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
Para verificar os detalhes da página de dados:
dbcc traceon( 3604 )
go
DBCC page( 0, 1, 3519, 1 ) with tableresults
Desvio:
Slot 0, Offset 0x60, Length 3016, DumpStyle BYTE
Slot 1, Offset 0xc28, Length 1016, DumpStyle BYTE
Slot 2, Offset 0x1020, Length 3016, DumpStyle BYTE
Atualizar um dos registros, para que não caiba na página atual, e ocorrerá a divisão da página (ou seja, será criada uma nova página?
update mytest
set filler = replicate( 'B', 3000 )
where something_to_see_in_data = '00002'
Agora verificando as páginas novamente:
DBCC IND ( 0, 'mytest', 1);
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
| PageFID | PagePID | IAMFID | IAMPID | ObjectID | IndexID | PartitionNumber | PartitionID | iam_chain_type | PageType | IndexLevel |
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
| 1 | 3520 | NULL | NULL | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 10 | NULL |
| 1 | 3519 | 1 | 3520 | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 1 | 0 |
| 1 | 3521 | 1 | 3520 | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 2 | 1 |
| 1 | 3522 | 1 | 3520 | 2065259704 | 1 | 1 | 72057595357560832 | In-row data | 1 | 0 |
+---------+---------+--------+--------+------------+---------+-----------------+-------------------+----------------+----------+------------+
Como podemos ver, duas novas páginas foram criadas:
3521 -- Index page
3522 -- Data page
Eu posso entender o motivo por trás da criação de um novo Data page(3522)
porque meus dados têm mais de 8kb, então uma nova página foi criada.
Qual é a utilidade da página Índice e quando ela será criada? Fiz muitas pesquisas no Google, não há documentação adequada na página de índice. É para manter o B-Tree?
As páginas de índice (tipo 2) contêm o(s) nível(is) não folha(s) da árvore b de índice clusterizado. O nível folha do índice clusterizado é apenas as próprias páginas de dados do objeto subjacente.
No caso especial em que todo o objeto (tabela no seu caso) cabe em uma única página, o SQL Server não cria uma página de índice separada, pois não há necessidade.
No seu exemplo, a primeira página de índice é criada quando a divisão de página resulta na tabela que consiste em mais de uma página de dados pela primeira vez.
As páginas de índice também são usadas para todos os níveis de índices de árvore b não clusterizados.
As páginas de índice também podem ser inspecionadas com
DBCC PAGE
. O estilo de despejo 3 é o mais informativo, pois mostra o arquivo filho e os ponteiros de página para intervalos de chave de índice. Esta é a informação necessária para navegar para baixo (potencialmente vários níveis) do índice da árvore b.À medida que o número de linhas no índice aumenta, o número de níveis no índice também aumenta.
Ver:
Informações abrangentes sobre tabelas e índices internos podem ser encontradas nos livros Microsoft SQL Server Internals de Kalen Delaney et al.
Uma nova página de índice será criada sempre que uma página de índice existente precisar ser dividida. Se essa página for a página raiz (topo da árvore do índice), o índice ganha um novo nível como resultado. As páginas de índice podem se dividir se a chave de índice for ampliada ou se outra entrada for necessária nessa página (por exemplo, para se referir a uma nova página filha) e não houver espaço suficiente.