Re[17]: [SQL Server] Анализ всех запросов к таблице
От: _ABC_  
Дата: 30.07.15 09:50
Оценка: 117 (2)
Здравствуйте, Sinclair, Вы писали:

_AB>>Но просто перейдет к новой странице, как только старая заполнится — это да.

S>Хм. А разве он не сделает page split крайней страницы в момент её заполнения?
И нет и да. Протестировал как раз перед тем, как написать пост. Тестировал на 2012-м,
но уверен в аналогичном поведении как минимум с 2008-го.

Да — логически операция одна — page split, но она оптимизированна для вставки в конец.

Нет — при выделении страницы в конце индекса он выделяет новую страницу и пишет туда только новую запись.
При разделении в середине он делит страницу пополам и добавляет запись на одну из поделенных страниц.

S>А зачем писать page split в журнал транзакций?

S>Разве эта информация нужна для undo/redo?

https://technet.microsoft.com/en-us/library/jj835093%28v=sql.110%29.aspx?f=255&MSPPError=-2147217396

Many types of operations are recorded in the transaction log. These operations include:
* Every extent and page allocation or deallocation

Все операции со страницами пишутся в лог.

Но на самом деле в журнал пишется информация не просто о выделении новой страницы, а именно о том,
что произошел page split. И там есть несколько логических операций, одна из которых применяется
только для разделения страниц в середине индекса. Это удаление записей на старой странице.

В любом случае, эта информация в том или оном виде нужна для undo/redo.
Каждая запись в логе о модификации строки содержит в себе физический адрес записи (page id, slot id).
Поэтому без логгирования операций со страницами никак не обойтись.

[Добавлено]. Собственно, журналирование изменения адреса перенесенных на новую страницу данных и есть основной
фактор в данном случае. Чем больше записей было на разделенной странице, тем больше места потребуется в журнале.
Отредактировано 30.07.2015 9:54 Does not matter . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.