Подсказки опережающего чтения с диска
Описание
Для запросов, требующих чтения больших данных, обеспечивается оптимизация доступа ядра к чтению файлов в страничный кеш (page cache) операционной системы через системную функцию posix_fadvise.
Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.
Функциональность используется в случаях:
- последовательного сканирования;
- индексного сканирования;
- сканирования только индекcов;
- использования временных файлов при сортировках и слияниях.
Цель функциональности – ускорение выполнения запросов, требующих чтения больших блоков данных.
Настройка
Конфигурационные параметры
Для включения функциональности используется параметр enable_prefetch, а для управления поведением prefetch_rows_number_threshold:
| Параметр | Тип | Описание | Значение по умолчанию | Допустимые значения |
|---|---|---|---|---|
enable_prefetch | bool | Включение функциональности подсказок опережающего чтения с диска | off | on/off |
prefetch_rows_number_threshold | integer | Параметр устанавливает минимальный порог ожидаемых строк таблицы, для которой будет включена функциональность. В общем случае функциональность выключена, но может быть включена для отдельных таблиц | -1 | -1 – 2147483647 |
Для применения параметров достаточно перечитать конфигурацию (reload).
Особенности реализации
При выполнении запроса проверяется количество ожидаемых строк, и если значение параметра prefetch_seqscan_rows_threshold больше -1 и меньше или равно количеству ожидаемых строк, выполняется системный вызов posix_fadvise, который информирует ядро о том, что планируется чтение больших блоков данных.
Системный вызов posix_fadvise позволяет процессу информировать ядро о предпочитаемой им схеме обращения к данным файла.
Ядро может при необходимости использовать информацию, предоставляемую системным вызовом posix_fadvise для оптимизации задействования им буферной кеш-памяти, повышая тем самым производительность ввода-вывода для процесса и для системы в целом.
При вызове posix_fadvise используется аргумент POSIX_FADV_SEQUENTIAL, который говорит о том, что процесс предполагает последовательное считывание данных от меньших смещений к большим.
Эта операция устанавливает для окна упреждающего считывания данных из файла его удвоенное исходное значение.
Управление
Параметр prefetch_rows_number_threshold можно задать для каждой таблицы отдельно:
-
При создании таблицы:
CREATE TABLE sample_table (i INTEGER) WITH (prefetch_rows_number_threshold = 100); -
При редактировании таблицы:
ALTER TABLE sample_table SET (prefetch_rows_number_threshold = 100);
Если параметр prefetch_rows_number_threshold задан для таблицы, то он имеет приоритет над общим параметром prefetch_rows_number_threshold.
Если параметр enable_prefetch включен (on) и параметр для таблицы не задан или его значение равно -1, используется значение общего параметра prefetch_rows_number_threshold (если его значение больше -1).
Диагностика
При попытке установить значение конфигурационных параметров данной функциональности под лицензией Standard будет выведено сообщение вида:
Option "prefetch_rows_number_threshold" is prohibited due to license agreement
Сценарии использования
Проверка активности механизма опережающего чтения
В данном разделе приведен пример проверки активности функциональности.
- Установите параметр
log_min_messageв значениеDEBUG5. - Создайте таблицу:
CREATE TABLE t1 (i INTEGER);
INSERT INTO t1(i) SELECT * FROM generate_series(1, 1000);
-
Активируйте параметр
enable_prefetch:ALTER SYSTEM SET enable_prefetch = on;
ALTER SYSTEMSELECT pg_reload_conf();
SHOW enable_prefetch;Параметр установлен:
enable_prefetch
-----------------
on -
Установите значение для параметра
prefetch_rows_number_threshold:ALTER SYSTEM SET prefetch_rows_number_threshold = 99;
ALTER SYSTEMSELECT pg_reload_conf();
SHOW prefetch_rows_number_threshold;Значение установлено:
prefetch_rows_number_threshold = 99 -
Используйте параметр
prefetch_rows_number_thresholdи проверьте лог-файл:EXPLAIN ANALYZE SELECT * FROM t1;\qcat log.log | grep SeqNextОжидаемый результат: Запись в логе имеет вид:
DEBUG: SeqNext, prefetch_rows_number_threshold to be used = 99Функциональность успешно активировалась на уровне всего сервера, и СУБД применила механизм опережающего чтения (
prefetch) при последовательном сканировании таблицы.