Então, imagine que tenho uma página que pretendo dividir.
USE mestre; VAI IF DATABASEPROPERTYEX (N'Páginas', N'Versão') > 0 COMEÇAR Páginas ALTER DATABASE SET SINGLE_USER COM ROLLBACK IMEDIATO; Páginas DROP DATABASE; FIM VAI CREATE DATABASE Páginas; VAI IF EXISTS(SELECT object_id FROM sys.objects WHERE name = 'PageSplit') COMEÇAR DROP TABLE PageSplit ; FIM Páginas de USO; VAI CREATE TABLE PageSplit ( c1 IDENTIDADE INT , c2 VARCHAR(2000) DEFAULT REPLICATE('b', 1000) ); VAI CRIAR ÍNDICE CLUSTERED ÚNICO CIX_c1 ON dbo.PageSplit ( [c1] ASC ); VAI INSERIR NOS VALORES PADRÃO DO PageSplit; GO 7 DBCC IND(Páginas,PageSplit,-1); VAI DBCC TRACEON(3604); VAI DBCC PAGE (Páginas,1,231,3); VAI -- m_freeCnt = 977
Neste ponto, preciso apenas atualizar uma linha da seguinte forma e obtenho uma divisão: 3 linhas para uma página, 4 para a outra:
ATUALIZAR Divisão de página SET c2 = REPLICAR('b', 2000) ONDE c1 = 1 ; VAI
Então, minha pergunta é a seguinte: quando acontece a atualização: antes ou depois da divisão da página? Presumo que ocorra após a divisão.
Anexei a saída do SQL Profiler e DBCC IND. Apenas uma observação lateral, a linha atualizada permaneceu na página original.
Apliquei o conselho do SQL Kiwi. Veja os resultados aqui:
UPDATE
Isso aconteceria após a divisão porque, do ponto de vista do estado dos dados, o SQL Server nunca substituirá outra linha atualmente alocada no processo .Além disso, se o SQL Server sobrescrever uma parte de outra linha e essa linha tiver que ser movida, ele não saberá quais dados copiar para a nova página. Uma cópia da linha pode ser mantida em um buffer temporário na memória... que... é a própria definição de uma página de dados .
E assim o processo de divisão é o seguinte:
Por fim,
UPDATE
ocorre o , que está sempre livre para sobrescrever partes não alocadas da página.