Вопрос по write-ahead logging
От: SL  
Дата: 06.10.17 13:51
Оценка: 3 (1)
Здравствуйте заинтересовал вопрос как работает WAL и в чем его преимущества.

"классическая технология" с файлом базы данных и логом транзакции и упрошено для однопоточной системы(что бы не заморачиваться с блокировками) механизм коммита выглядит так:

Begin Tran
1 В лог транзакции пишется id транзакции, флаг начало транзакции и пр. после вызывается flush для лога транзакции.

................../какие то действия/..................................

Begin commit
2. В лог транзакции сохраняются все оригинальные файловые страницы из файла БД для восстановления (undo) которые были изменены в процессе работы транзакции, размер файла базы данных до начала коммита, и пр. после чего вызывается flush для лога транзакции
3. В файл базы данных копируются страницы которые были изменены во время работы транзакции после вызывается flush для файла базы
4. Записываем флаг в лог транзакции об успешном завершении и после чего вызывается flush для лога транзакции

End commit


EndTran


очевидные минусы вызовы flush я так понимаю в WAL это реализовано иначе из того, что я прочитал в интернете я так понимаю механизм выглядит так

Begin Tran
1 В лог транзакции пишется id транзакции, флаг начала транзакции и пр. после вызывается flush для лога транзакции.

................../какие то действия/..................................
Begin commit
1. В лог транзакции сохраняются все измененные страницы из кэша транзакции, сохраняется дополнительная информация о соответствии адреса страниц в логе транзакции и файле базы данных, после flush для лога транзакции.
2. В БД (в оперативной памяти) добавляется информация об адресах страницы которые нужно читать не из основного файла данный, а из лога транзакции
End commit
EndTran

после чего в фоновом потоке или при "простое", или определенном размере лога транзакции, происходит перенос файловых страниц из лога транзакции в файла данный:

.................Begin move......................

1. копирование страниц в файл данных из лога транзакции на основе информации об соответствии адресов файловых страниц в логе транзакции и файле БД, вызов flush
2. Внесение информации в лог транзакции об удачном перемещении, вызов flush
3. В БД (в оперативной памяти) удаляется информация об адресах страницы которые нужно читать не из основного файла данный

.................End move......................


по сути по количество вызовов flush одинаково во всех режимах, и выигрыш возможен только при наличии достаточных интервалов между транзакциями, если же система по нагрузкой с длинными и короткими транзакциями вперемешку постоянно, то особого выигрыша не будет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.