Как запись в журнал впереди улучшает производительность ввода-вывода в Postgres? - PullRequest
1 голос
/ 25 марта 2019

Я прочитал главу WAL руководства Postgres и был озадачен частью главы:

Использование WAL приводит к значительному сокращению числа операций записи на диск, поскольку для сохранения транзакции на диск требуется только файл журнала, а не каждый файл данных, измененный транзакцией.

Почему непрерывная запись в WAL более производительна, чем простая запись в сами данные таблицы / индекса?

Насколько я понимаю (забыв пока о преимуществах устойчивости WAL), postgres необходимо выполнить две операции с диском; Сначала pg необходимо зафиксировать WAL на диске, а затем вам все равно нужно изменить данные таблицы, чтобы они соответствовали WAL. Я уверен, что есть фундаментальный аспект этого, который я неправильно понял, но кажется, что добавление дополнительного шага между клиентской транзакцией и конечным состоянием данных таблицы не может фактически повысить общую производительность. Заранее спасибо!

1 Ответ

1 голос
/ 25 марта 2019

Вы в принципе правы: дополнительные записи в журнал транзакций сами по себе не уменьшат нагрузку ввода-вывода.

Но транзакция обычно затрагивает несколько файлов (таблиц, индексов и т. Д.).Если вы принудительно вынудите все эти файлы сохранить («синхронизировать»), вам придется больше загружать ввод-вывод, чем при синхронизации только одного файла.

Конечно, все эти файлы должны быть записаны и синхронизированыв конечном итоге (во время контрольной точки ), но часто одни и те же данные изменяются несколько раз между двумя контрольными точками, и затем соответствующие файлы должны быть синхронизированы только один раз.

...