Usuário com melhor resposta
Ocorre page split em um clustered index em um campo sequencial como INT por exemplo?

Pergunta
-
Boa tarde.
Eu estou com uma dúvida de quando corre um PAGE SPLIT em que o SQL Server passa metade dos registros de uma página para a outra, e quando o SQL Server apenas cria uma nova page leaf. Como é uma dúvida bem específica não encontrei no google.
Eu entendo que quando temos um Index em um campo DATA por exemplo, ao inserir um valor com data antiga, considerando que a PAGE LEAF em que será inserida esse registro esteja cheia, ocorre um PAGE SPLIT.
Minha dúvida é quando um novo registro é inserido mas não afeta a ordem dos registros logicamente e uma página está cheia.
Por exemplo, uma tabela possui index cluster int e a pagina folha está cheia. O último valor do indice cluster é o id 56. No próximo insert id 57 o sql server deve alocar uma nova PAGE LEAF para essa tabela, para acomodar o ID 57. Essa nova alocação de página também é feita um page split passando metade dos registros para a nova pagina leaf e fragmentando internamente o índice? OU apenas é alocada uma página nova para esse registro, sem page split, deixando a nova page leaf apenas com o id 57?
Obrigado pessoal!!!
Eduardo Moura Schaukoski
Respostas
-
Durval obrigado pela resposta, gostei muito do artigo.
Ainda sim continua minha dúvida. O artigo explica sobre FillFactor e inserção de valores fora da sequência ocasionando page splits.
A minha dúvida é quando um novo registro é inserido mas Não afeta a ordem logica do indice e a ultima pagina do indice está cheia. Ocasiona page split ou apenas uma nova alocação de página?
Olá Eduardo,
Se não afeta a ordem lógica, possivelmente esse registro não precisará realizar page splits em páginas cheias, correto? Logo, se a última página estiver cheia, que é sua dúvida, o registro será alocado em uma nova página.
[]'s
Se a resposta ajudou, classifique e ajude outros membros da comunidade.
- Marcado como Resposta Eduardo Moura Schaukoski quinta-feira, 27 de fevereiro de 2014 13:18
-
- Marcado como Resposta Eduardo Moura Schaukoski quinta-feira, 27 de fevereiro de 2014 13:18
Todas as Respostas
-
Olá Eduardo.
Se a próxima linha que vc adicionar não couber na página, o sql server alocaria outras duas páginas adicionais utilizando o processo de divisão (page splitting). A página raiz seria empurrada para baixo na estrutura, tornando-se uma página de nível folha. Metade dos dados da página de índice é colocada em uma das páginas recentemente alocada e a outra página nova, é alocada no topo da estrutura do índice para se tornar uma página raiz. (veja b-tree). Portanto, ele faria o split.
Espero ter ajudado!
Se foi útil, Vote!
Luiz Fernando Lima | Microsoft Partner | MCTS - SQL Server 2008 Implementation and Maintenance
-
Eduardo,
Veja este excelente artigo sobre o assunto, criado por um conceituado MVP.
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil" -
Eduardo,
Se a pagina está 100% preenchida, o SQL apenas aloca uma nova pagina de dados e coloca esse novo registro. Se a pagina digamos está 90% preenchida, e um novo registro ocuparia 12%, e o fillfactor está como 100%, os 10% restantes serão locados na pagina existente, e os demais 2% em uma nova pagina de dados.
Att,
Marcos Freccia [MTA|MCTS|MCITP|MCT SQL Server 2008]
Blog|Twitter
Assine também os feeds clicando aqui -
Obrigado pela resposta mas não esclareceu minha dúvida ainda.
"Minha dúvida é quando um novo registro é inserido mas NÃO afeta a ordem dos registros logicamente e uma página está cheia."
Por exemplo, possuo duas páginas no indice. A página 1 e 2. Esse índice é sobre uma coluna INT sequencial.
A página 2 está cheia, e o último valor da página 2 é o ID 56. Um insert de um ID 53 afetaria a ordem lógica do índice ocorrendo um page split. MAS e se eu inserir um ID 57, que não afeta a ordem, mesmo assim ocorreria um SPLIT? OU apenas uma nova alocação de página?
-
Obrigado pela resposta mas não esclareceu minha dúvida ainda.
"Minha dúvida é quando um novo registro é inserido mas NÃO afeta a ordem dos registros logicamente e uma página está cheia."
Por exemplo, possuo duas páginas no indice. A página 1 e 2. Esse índice é sobre uma coluna INT sequencial.
A página 2 está cheia, e o último valor da página 2 é o ID 56. Um insert de um ID 53 afetaria a ordem lógica do índice ocorrendo um page split. MAS e se eu inserir um ID 57, que não afeta a ordem, mesmo assim ocorreria um SPLIT? OU apenas uma nova alocação de página?
-
Durval obrigado pela resposta, gostei muito do artigo.
Ainda sim continua minha dúvida. O artigo explica sobre FillFactor e inserção de valores fora da sequência ocasionando page splits.
A minha dúvida é quando um novo registro é inserido mas Não afeta a ordem logica do indice e a ultima pagina do indice está cheia. Ocasiona page split ou apenas uma nova alocação de página?
-
Durval obrigado pela resposta, gostei muito do artigo.
Ainda sim continua minha dúvida. O artigo explica sobre FillFactor e inserção de valores fora da sequência ocasionando page splits.
A minha dúvida é quando um novo registro é inserido mas Não afeta a ordem logica do indice e a ultima pagina do indice está cheia. Ocasiona page split ou apenas uma nova alocação de página?
Olá Eduardo,
Se não afeta a ordem lógica, possivelmente esse registro não precisará realizar page splits em páginas cheias, correto? Logo, se a última página estiver cheia, que é sua dúvida, o registro será alocado em uma nova página.
[]'s
Se a resposta ajudou, classifique e ajude outros membros da comunidade.
- Marcado como Resposta Eduardo Moura Schaukoski quinta-feira, 27 de fevereiro de 2014 13:18
-
- Marcado como Resposta Eduardo Moura Schaukoski quinta-feira, 27 de fevereiro de 2014 13:18
-
Obrigado, era essa mesmo a minha dúvida!
- Editado Eduardo Moura Schaukoski quinta-feira, 27 de fevereiro de 2014 17:26