Перейти к основному содержимому

Подсказки опережающего чтения с диска

Описание

Для запросов, требующих чтения больших данных, обеспечивается оптимизация доступа ядра к чтению файлов в страничный кеш (page cache) операционной системы через системную функцию posix_fadvise.

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Функциональность используется в случаях:

  • последовательного сканирования;
  • индексного сканирования;
  • сканирования только индекcов;
  • использования временных файлов при сортировках и слияниях.

Цель функциональности – ускорение выполнения запросов, требующих чтения больших блоков данных.

Настройка

Конфигурационные параметры

Для включения функциональности используется параметр enable_prefetch, а для управления поведением prefetch_rows_number_threshold:

ПараметрТипОписаниеЗначение по умолчаниюДопустимые значения
enable_prefetchboolВключение функциональности подсказок опережающего чтения с дискаoffon/off
prefetch_rows_number_thresholdintegerПараметр устанавливает минимальный порог ожидаемых строк таблицы, для которой будет включена функциональность.
В общем случае функциональность выключена, но может быть включена для отдельных таблиц
-1-12147483647

Для применения параметров достаточно перечитать конфигурацию (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

Сценарии использования

Проверка активности механизма опережающего чтения

В данном разделе приведен пример проверки активности функциональности.

  1. Установите параметр log_min_message в значение DEBUG5.
  2. Создайте таблицу:
CREATE TABLE t1 (i INTEGER);
INSERT INTO t1(i) SELECT * FROM generate_series(1, 1000);
  1. Активируйте параметр enable_prefetch:

    ALTER SYSTEM SET enable_prefetch = on;

    ALTER SYSTEM
    SELECT pg_reload_conf();

    SHOW enable_prefetch;

    Параметр установлен:

    enable_prefetch
    -----------------
    on
  2. Установите значение для параметра prefetch_rows_number_threshold:

    ALTER SYSTEM SET prefetch_rows_number_threshold = 99;

    ALTER SYSTEM
    SELECT pg_reload_conf();

    SHOW prefetch_rows_number_threshold;

    Значение установлено:

    prefetch_rows_number_threshold = 99
  3. Используйте параметр prefetch_rows_number_threshold и проверьте лог-файл:

    EXPLAIN ANALYZE SELECT * FROM t1;
    \q
    cat log.log | grep SeqNext

    Ожидаемый результат: Запись в логе имеет вид:

    DEBUG:  SeqNext, prefetch_rows_number_threshold to be used = 99

    Функциональность успешно активировалась на уровне всего сервера, и СУБД применила механизм опережающего чтения (prefetch) при последовательном сканировании таблицы.