среда, 16 мая 2007 г.

Упреждающее чтение

Когда пользовательская нить читает данные, сначала она ищет необходимые ей страницы с данными в буферном пуле. Затем, если требуется, и не все данные оказались в буферах, нужные страницы с данными подгружаются в буферный пул с диска. Наиболее эффективное чтение происходит, когда сервер читает данные с диска не по отдельным страницам, а блоками по несколько страниц. Такое поведение в Информиксе реализовано, когда происходит последовательное сканирование таблицы или индекса в поисках нужных данных. Называется оно упреждающим чтением (Read Ahead). Можно настроить Информикс на чтение блоками по заданному кол-ву страниц, для этого служат параметры

RA_PAGES # Кол-во страниц упреждающего чтения
RA_THRESHOLD # Кол-во страниц которые не обработаны, и после которого начинается новое чтение

Условие использования упреждающего чтения - это последовательное сканирование. Если сервер выбрал для запроса последовательное сканирование, то будет включено упреждающее чтение для запроса.

Следующий этап оптимизации - это легкое сканирование или Light Scans. При таком типе чтения буферный пул Информикса не используется. Вместо него выделяется специальный пул в виртуальном сегменте, в который и производятся чтения большими блоками страниц. Light Scans имеет преимущество в том смысле что не вытесняются другие страницы из буферного пула, что позволяет не снижать производительность запросов к таблицам при чтении больших таблиц.

Условия для включения Light Scans в сессии:
- оптимизатор выбирает последовательное сканирование
- кол-во страниц в таблице больше чем число буферов в буферном пуле
- уровень изоляции сессии Dirty Read, Repeatable Read, Commited Read

Чтобы узнать, использует ли сессия Light Scans следуеть посмотреть вывод onstat -g ses sesid, раздел Memory pools, там могут быть пулы light_scan, lt_scan_rbuff, lt_scan_bufs. Или посмотреть выделенные фрагменты для пула с помощью onstat -g afr sesid (там может быть пул с именем light_scan). Далее можно посмотреть вывод команды onstat -g lsc.

Размер буферов для Light Scans вычисляется вот так:

( ( RA_PAGES + RA_THRESHOLD)/(MAXAIOSIZE + PAGESIZE))

Комментариев нет: