Em suma, no SQL Server o Page Split é uma operação que acontece quando um dado é inserido ou alterado, expandindo seu tamanho em uma página de dados e essa página não possui espaço livre o suficiente para realizar essa operação. Consequentemente, a página acaba sendo dividia em duas para comportar as novas informações, o que causa uma operação custosa de disco (maior gargalo no banco de dados).
Uma página (page) possui 8Kb de tamanho. Quando um dado é inserido na base de dados, este dado é colocado na page, enquanto a mesma estiver espaço livre. Quando um dado “grande” é inserido, ou um dado é alterado com valores maiores, ocorre uma quebra de página. Como funciona? Quando uma página estoura o limite de 8Kb, ele remove alguns dados da página atual e os move para outra página de dados. Isto é feito a fim de liberar espaço para novas linhas (dados) na página enquanto a mesma ter espaço livre.
Quando ocorre muitas pages split (divisão de páginas), pode ocorrer a diminuição do desempenho do SQL Server por causa do grande número de operações de I/O. As pages split podem ser monitoradas usando o Performance Monitor, o “SQL Server->Access Methods->Pages Split/sec counter”, através de uma query simples como irei mostrar neste artigo, ou neste link que mostra como monitorar através de um processo.
Aqui vai algumas dicas para evitar/reduzir as pages splits:
• Reconstruir índices com frequência para esvaziar o espaço do FILL FACTOR para mais dados.
• Aumento do uso de chaves primárias e o uso do Index Cluster nelas.
• Um hardware mais rápido e eficiente também reduz as pages split.
• Definir a opção FILL FACTOR apropriada para reservar espaço livre em cada página do índice. As faixas do FILL FACTOR são de 1-100. Esta paixa especifica a porcentagem da página de índice para ser livre. Se uma tabela está apenas em Read Only, defina o FILL FACTOR para 100%. Quando uma tabela possui bastante modificações, defina o FILL FACTOR para 70% ou 80%.
Como alterar o FILL FACTOR dos índices:
Use ALAN_TESTE; GO ALTER INDEX IX_MEU_INDICE ON Tabela.Campo REBUILD WITH (FILLFACTOR = 80); GO
A query para obter as pages split é essa:
SELECT COUNT(1) AS NumberOfSplits ,AllocUnitName ,Context FROM fn_dblog(NULL,NULL) WHERE Operation = 'LOP_DELETE_SPLIT' GROUP BY AllocUnitName, Context ORDER BY NumberOfSplits DESC
Reblogged this on Alex Souza.