Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Поэтому кеширование для таких файлов отключается.
Нет. Так никто не делает.
S>>В MMF мы не можем этого гарантировать.
НС>Так не надо лог в MMF писать, о чем и речь.
Это как раз понятно. Лог пишется в режиме stream: добавляем всегда в конец. Но отсутствие кэширования (== flush на каждый write) гарантированно убъёт производительность при модификациях.
Представьте себе выполнение операции update employee set salary = salary * 1.05 where region = @region.
То, что вы предлагаете, означает выполнение flush лога N раз для N записей, попавших под предикат.
Это — очень плохое решение, т.к.
— на HDD мы получим ограничение быстродействия в ~100 изменений в секунду, т.е. транзакция, трогающая всего лишь 1000 записей, будет выполняться не меньше 10 секунд.
— на SSD мы получим многократные перезаписи одной и той же страницы, очень быстро изнашивая диск.
S>>2. Мы добавляем к логу запись (@x, oldX, newX); (без flush)
НС>Так что тут если какое то буферизирование при записи в лог и делать, то только чисто программное, на уровне прикладного кода.
По большому счёту, нам всё равно, как устроена буферизация при записи в лог. Там главное — возможность сделать честный flush() в нужный приложению момент.
Отключение буферизации делается в первую очередь для того, чтобы избежать бессмысленного перекладывания данных из одного буфера в другой, т.к. нам всё равно известны точные моменты, когда надо всё же сделать flush.
То есть в дотнете / windows можно реализовать два способа:
1. FileStream.Flush + FlushFileBuffers (неэффективно)
2. Открыть файл c флагами FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH. Тогда можно делать просто FileStream.Flush().
Подчеркну: в обоих случаях мы делаем Flush лога на на каждое изменение, а только на каждый commit transaction. То есть транзакция, которая трогает 1000 записей, будет выполняться ~10ms (если выбранный размер буфера достаточен для того, чтобы избежать промежуточных сбросов в процессе исполнения).
НС>И, в любом случае, MMF для файла лога бессмысленен и бесполезен, там все равно запись и чтение строго последовательные.
Речь идёт про MMF для файла данных.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.