none
Ocorre page split em um clustered index em um campo sequencial como INT por exemplo? RRS feed

  • 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

    quarta-feira, 26 de fevereiro de 2014 18:33

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.

    quinta-feira, 27 de fevereiro de 2014 12:49
  • Eduardo,

    Se o campo INT é sequencial e faz parte da sua chave primaria, não ocorre page split. O novo registro é inserido em uma nova pagina e pronto.


    Att,
    Marcos Freccia [MTA|MCTS|MCITP|MCT SQL Server 2008]
    Blog|Twitter
    Assine também os feeds clicando aqui

    quinta-feira, 27 de fevereiro de 2014 12:53

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

    quarta-feira, 26 de fevereiro de 2014 21:06
  • Eduardo,

    Veja este excelente artigo sobre o assunto, criado por um conceituado MVP.

    http://social.technet.microsoft.com/wiki/contents/articles/20884.sql-server-when-foreign-keys-will-cause-conflicts-with-fillfactor.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 27 de fevereiro de 2014 00:26
    Moderador
  • 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

    quinta-feira, 27 de fevereiro de 2014 01:57
  • 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?


    quinta-feira, 27 de fevereiro de 2014 11:55
  • 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?


    quinta-feira, 27 de fevereiro de 2014 11:55
  • 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?

    quinta-feira, 27 de fevereiro de 2014 12:06
  • 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.

    quinta-feira, 27 de fevereiro de 2014 12:49
  • Eduardo,

    Se o campo INT é sequencial e faz parte da sua chave primaria, não ocorre page split. O novo registro é inserido em uma nova pagina e pronto.


    Att,
    Marcos Freccia [MTA|MCTS|MCITP|MCT SQL Server 2008]
    Blog|Twitter
    Assine também os feeds clicando aqui

    quinta-feira, 27 de fevereiro de 2014 12:53
  • Obrigado, era essa mesmo a minha dúvida!

    quinta-feira, 27 de fevereiro de 2014 13:20