Чарли Каро, InterBase Software Corp.:IB дает 4-х варианта выбора:
- 1024 – слишком маленький
- 2048 – не такой большой
- 4096 – то, что надо
- 8192 – никогда не видела, чтобы работало лучше, чем 4096.
Для NTFS (Windows NT) лучше всего отформатировать раздел с размером кластера 4К для размещения баз данных. Соответственно, у всех баз данных, помещаемых в таком разделе, лучше выбрать размер страницы 4К. Размер страниц 1К, 2К и 8К будет приводить к лишним чтениям с диска (1К, 2К) или лишней записи (8К).Стоимость вычисления контрольных сумм пропорциональна размеру страницы базы данных. Контрольная сумма страницы вычисляется всегда при чтении или записи страницы в БД. For the large page sizes, this was our private op-code for telling microprocessors to flush their L1 and L2 level hardware caches.
В IB Database 5.0 для Windows NT вычисление контрольной суммы страницы выключено, поэтому вам не нужно заботиться об этом при выборе размера страницы БД.
Я не могу сказать, помогает ли установить размер страницы БД равным размеру страницы памяти операционной системы, но могу дать некоторые комментарии по поводу размера блока буфера кэша файловой системы. Поскольку большинство операционных систем используют механизм virtual memory mapping для буфера кэша, то как правило размер страницы виртуальной памяти равен размеру страницы буфера кэша.
Наш опыт, приобретенный при создании write-ahead log поверх файловой системы, показывает что важно обеспечить совпадение размера блоков ввода-вывода с размером блока буфера кэша файловой системы. Log-файлы как правило не вмещаются в буфер кэша и периодически записываются по checkpoint interval. Задача буферизации ввода-вывода – прочитать блок определенной длины с тем, чтобы оставить его резидентным. Если размер, запрашиваемый вводом-выводом такой-же как и у буфера ОС, то лишних чтений не происходит. Если же размер блока буфера ОС отличается от блока ввода-вывода, то это вызвает дополнительное чтение данных с диска файловой системой – не совсем желательный сценарий для производительности. Если для log используется последовательное чтение, то дополнительные операции чтения не влияют на производительность, т. к. все равно используется механизм опережающего чтения.
Для IB существует два случая, в которых такое поведение может повлиять в худшую сторону. Когда IB читает страницы БД, то страницы кэшируются два раза: 1) в кэш-буфере базы данных IB, и 2) в кэш-буфере операционной системы. Другие подсистемы сервера (файловый сервис, web-сервер) могут вытеснить страницы БД из кэша операционной системы. Если теперь IB модифицирует некую страницу, находящуюся в кэше, то при несовпадении размеров блока кэша ОС и страницы БД операционная система прочитает часть данных с диска, и запишет полный измененный блок на диск. Если размеры страниц равны, то будет аллокирован новый блок в кэш буфере, прочитан, и только после этого записан блок с изменениями на диск.
Второй случай относится к IB SHADOW. IB всегда производит чтение только из основной БД, и никогда из shadow. При записи измененных страниц БД в shadow, операционная система должна прочитать эту страницу из shadow. Операционная система просто не имеет понятия о том, что БД и shadow являются эквивалентами (одинаковыми файлами). Если размер страниц совпадает, то возможно операций чтения при изменении shadow возникать не будет.
Все вышеизложенное относится к Unix. Я не делал тестов для Windows NTFS. В любом случае, большая часть NTFS пришла из DEC (VMS file system). Но VMS не имеет буфера кэша... (RMS не в счет).