Сканер В-дереьев появился в IDS версий 7.31.UD8, 9.21.UC7, 9.30.UC6 и более поздних. Сканер В-деревьев очищает "грязные" элементы индекса и сжимает листья (leaf pages) В-дерева. Новая нить (thread) btscanner заменила собой старую нить btcleaner. Btscanner является более эффективным, гибким и более простым в администрировании инструментом по сравнению с btcleaner.
При удалении элемента индекса в случае для журналируемой таблицы, операция удаления не удаляет элемент индекса в соответствующей странице индекса. Данный элемент индекса всего лишь помечается как удаленный, не освобождая занимаемого им места. Этот элемент остается заблокированным на протяжении выполнения транзакции (т.н. uncommitted deleted item). При выполнении операции COMMIT, блокировка снимается, но элемент все еще не удаляется (committed deleted item). Большое количество подобных элементов может негативно сказаться на ресурсах системы, так как приложения, натолкнувшиеся на подобный элемент, выполняют дополнительную работу по проверке наличия блокировки. Также, размер индекса растет по мере увеличения количества удаленных элементов. Это ведет к дополнительным операциям ввода-вывода страниц индекса.
Для оптимального выполнения запросов, элементы индекса, отмеченные для удаления, должны быть удалены, а индекс должен быть сжат и перебалансирован. Процесс удаления таких элементов называется очисткой индекса (index cleaning). В IDS эту работу выполняет специальная нить - btscanner. Она отвечает за асинхронную очистку индекса. Данная статья в деталях рассказывает о нити btscanner.
Основные возможности сканера B-деревьев
Принцип работы сканера B-деревьев существенно отличается от устаревшего механизма btcleaner. Вот несколько основных возможностей нового инструмента:
- Нити btscanner могут быть созданы и сконфигурированы динамически, во время работы сервера. Фиксированное число нитей запускается при старте сервера.
- Элементы индекса, отмеченные для удаления, будучи не удаленными, заставляют сервер выпольнять больше лишней работы. Сканер В-деревьев определяет такие индексы и делает их своей целью для очистки.
- Для каждого индекса, каждый случай выявления элементов, подлежащих удалению, фиксируется и отслеживается через специальный счетчик hit-count . Если значение hit-count превышает определенный предел, этот индекс становится кандидатом на очистку. Нить btscanner сканирует все разделы индекса для которых был превышен предел для hit-count и добавляет индекс в список hot-list.
- Сканер B-девьев берет индекс, отмеченный в hot-list и сканирует некоторое количество страниц-листьев индекса (index leaf pages) для очистки. Количество сканируемых страниц определятся выбранным методом сканирования. Сканер B-деревьев поддерживает несколько методов сканирования страниц индекса: leaf scan, range scan и ALICE scan. Нить btscanner удаляет элементы индекса, отмеченные для удаления со страниц-листьев индекса в определенном диапазоне. При необходимости, нить осуществляет слияние страниц и сжатие индекса.
Конфигурация сканера B-деревьев
Сканер B-деревьев может быть сконфигурирован с помощью одного из следующих методов:
- Файл конфигурации IDS ($ONCONFIG)
- Команды onmode -C в режиме On-Line
Следующий раздел описывает оба данных метода.
Конфигурирование сканера B-деревьев через ONCONFIG
В файле конфигурации IDS имеется параметр BTSCANNER, который позволяет управлять сканером B-деревьев. Данный параметр имеет пять опций, которые могут быть установлены администратором. Иначе, используются параметры по-умолчанию (см. Таблицу 1).
Таблица 1. Опции параметра BTSCANNER
| Опция | Значение по-умолчанию | Описание |
|---|---|---|
| num | 1 | Количество нитей btscanner, которые будет запущены при старте IDS. |
| threshold | 5000 | Количество элементов, с которыми должен столкнуться сканер, прежде чем индек будет добавлен в список очистки hot-list. |
| rangesize | -1 | Минимальный размер фрагмента индекса (в страницах), необходимый для использования range scans. |
| alice | 6 | Режим ALICE (для всего инстанса). |
| compression | default | Уровень компрессии для сканера B-деревьев (для всего инстанса; доступен начиная с версии IDS v11.50xC2 и более поздних) |
Ниже приведен пример конфигурации BTSCANNER:
BTSCANNER num=1,threshold=5000,rangesize=-1,alice=6,compression=default |
Динамическое конфигурирование сканера B-деревьев c помощью утилиты Onmode
Сканер В-деревьев может быть сконфигурирован в режиме On-Line c помощью команды onmode -C (см. Таблицу 2).
Примечание: Изменения конфигурции, которые были произведены с помощью onmode -C , применяются немедленно. Но изменения в конфигурации не сохраняются после перезагрузки сервера. Изменения, которые необходимо сохранить, должны быть сделаны в параметре BTSCANNER файла конфигурации ONCONFIG.
Таблица 2. Команды onmode -C
| Команда | Описание |
|---|---|
| onmode -C start count | Запускает count нитей btscanner. |
| onmode -C stop count | Останавливает count нитей btscanner. |
| onmode -C duration value | Устанавливает value секунд, в течении которых hot-list список остается актуален. Список hot-list пересоздается без прерывания работающих нитей btscnner по истечении указанного интервала. |
| onmode -C threshold value | Устанавливает предельное значение hit-count для индекса. |
| onmode -C rangesize value | Устанавливает минимальное значение (в страницах) фрагментов индекса для работы range scans. |
| onmode -C alice newmode | Устанавливает режим ALICE для инстанса, равный newmode. |
| onmode -C compression newlevel | Устанавливает уровень компрессии индекса, равный newlevel (для всего инстанса; доступен начиная с версии IDS newlevel. v11.50xC2 и более поздних) |
Следующий запрос показывает текущие значения параметров сканера В-деревьев:
select cf_effective from sysmaster:syscfgtab where cf_name = 'BTSCANNER'; |
Методы сканирования и очистки индекса
Будучи к режиме leaf scan, нить btscanner начинает сканирование с левой крайней страницы-листа (leaf page) индекса и сканирует все страницы-листья, очищая их от удаленных элементов. Этот метод хорошо применим в случае небольшого размера индекса, когда большинство страниц находится в буферном пуле (buffer pool), или же в случае привязанного (attached) индекса.
В случае использования данного метода для больших индексов, количество операций ввода-вывода возрастает по мере записи очередной страницы-листа в буферный пул. В ситуации, когда лишь незначительная часть страниц содержит удаленные элементы, СУБД выполнить большое количество лишних операций ввода-вывода. При этом также существует вероятность того, что нужные страницы будут вытеснены из буферного пула.
В сравнении с leaf scan, range scan не читает всех страниц-листьев индекса. Вместо этого сканер В-деревьев отслеживает младшую и старшую логические страницы индекса, содержащие удаленные элементы. Механизм range scan читает только страницы-листья в этом диапазоне. Также, при сканировании диапазона страницы читаются блоками по 128 страниц с использованием light scans. Эти страницы записываются в буферный пул и очищаются от удаленных элементов.
Метод range scan существенно превосходит leaf scan, поскольку выполняет меньше операций ввода-вывода, читая только часть страниц индекса. Также он зачастую обходит буферный пул благодаря механизму light scans. Но несмотря на это, в некоторых экстремальных ситуациях, младшая и старшая страницы могут быть соответственно в начале и в конце индекса, так что весь индекс попадает в диапазон сканирования. Это приведет к лишним операциям ввода-вывода.
Начиная с версии 10.00.xC5, IDS поддерживает новый режим очистки индексов - Автономная Линейная Очистка Индексов (Autonomic Linear Index Cleaning). Его суть заключается в следующем: страницы фрагментов индекса группируются в так называемые регионы, которые в свою очередь состоят из блоков равной величины. Каждому региону ставится в соответствие бит на специальном битмапе. При обнаружении отмеченного для удаления элемента индекса, устанавливается значение бита соответствующего региона. Таким образом, сканер В-деревьев сканирует только те регионы, чьи биты отмечены в битмапе.
Например:
Таблица 3. Пример для режима ALICE scan
| P1, P2 .... P256 | P257, P258 .... P512 | P513, P514 .... P768 | P769, P770 .... P1024 |
| Index Region No. 1 | Index Region No. 2 | Index Region No. 3 | Index Region No. 4 |
| Bit No. 1 | Bit No. 2 | Bit No. 3 | Bit No. 4 |
Сканер В-деревьев автоматически корректирует размер битмапа, основываясь на эффективности очистки. Эффективность очистки измеряется через отношение числа прочитанных крупных блоков к числу крупных блоков, содержащих отмеченные для удаления элементы. Если значение этого коэффициента большое, это означает что очистка индекса недостаточно эффективна и, что размер битмапа должен быть скорректирован.
Начальных размер битмапа обычно не менее 8 байт. Размер битмапа увеличивается порциями, размер которых равен 4 байтам. Если сервер находится в режиме online, битмап никогда не сократится. Значение эффективности по-умолчанию равно 30%. Чтобы избежать негативного влияния на общую эффективность одного лишь "ненормального" сканирования, эффективность должна быть на приличном уровне. Необходимо как минимум пять таких сканирований, чтобы размер битмапа вырос.
Режим ALICE может быть установлен в значение в диапазоне между 0 и 12. Если значение ALICE равно 0, это означает что ALICE выключен. Если ALICE равен N, это означает, что 2(12-N) "легких" операций ввода-вывода необходимо для покрытия диапазона индекса. За одну операцию "легкого сканирования" может быть просканировано 128 страниц.
Определение значений режима ALICE и размера битмапа
Рассмотрим зависимость между режимом ALICE и размером битмапа на примере платформы с размером страницы 4 Кб:
В режиме ALICE по-умолчанию, равном 6, каждый бит битмапа описывает регион индекса размером 26 * 128 * 4Kb = 32 Мб.
При самом высоком значении ALICE, равном 12, каждый бит битмапа соответствует региону индекса размером 20 * 128 * 4 Кб = 512 Кб.
Каким должен быть режим ALICE, чтобы обрабатывать индекс с размером региона, равным 2 Мб?
ALICE mode = 12 - log2 = (2 Мб / 512 Кб) = 12 - log 2 4 = 10
Сколько битов потребуется для индекса размером в 2 Гб при режиме ALICE = 7?
В режиме ALICE = 7, каждый бит битмапа описывает регион индекса размером 212-7 * 512 Кб = 16 Мб.
Размер битмапа будет равен: 2 Гб / 16 Мб = 128 бит.
Таблица 4. Описание столбцов в выводе "onstat -C"
| id | Идентификатор нити сканера В-деревьев |
|---|---|
| Partnum | Раздел индекса, над которым работает нить btscanner |
| Cmd | Команда, которую выполняет нить btscanner в данный момент |
Листинг 1. Пример вывода "onstat -C"
B-tree Scanner Information
Profile
=======
Active Threads 1
Global Commands 2000000 Building hot list
Number of partition scans 47
Main Block 0x000000004c619ce8
BTC Admin 0x000000004b7021b8
BTS info id Prio Partnum Key Cmd
0x4b828a58 0 High 0x00000000 0 40 Yield N
Number of leaves pages scanned 3675
Number of leaves with deleted items 129
Time spent cleaning (sec) 5
Number of index compresses 61
Number of deleted items 487
Number of index range scans 0
Number of index leaf scans 0
Number of index alice scans 4
|
Просмотр списка hot-list (onstat -C hot)
Таблица 5. Описание столбцов в выводе "onstat -C hot"
| Partnum | Номер раздела индекса |
|---|---|
| Key | Номер ключа индекса |
| Hits | Текущее значение счетчика hit-count для данного индекса |
Звездочкой отмечается, что данный раздел индекса был очищен в данном hot-list.
Листинг 2. Пример вывода "onstat -C hot"
B-tree Scanner Information
Index Hot List
==============
Current Item 2 List Created 18:30:16
List Size 1 List expires in 37 sec
Hit Threshold 5000 Range Scan Threshold -1
Partnum Key Hits
0x00100137 1 5031 *
|
Просмотр статистики для разделов индекса (onstat -C part)
Таблица 6. Описание столбцов в выводе "onstat -C part"
| Partnum | Номер раздела индекса |
|---|---|
| Key | Номер ключа индекса |
| Positions | Количество выполненных операций чтения данного индекса |
| Compress | Количество компресий страниц данного индекса |
| Split | Здесь отмечается количество разделений страниц индекса |
| C_Level | Уровень компрессии для данного раздела индекса (Доступно начиная с версии 11.50.xC2 и более поздних) |
"C" означает, что данный раздел индекса недоступен ввиду его текущей очистки.
"N" означает, что данный разделу больше не требуется очистка.
Листинг 3. Пример вывода "onstat -C part"
B-tree Scanner Information Index Statistics ================ Partnum Key Positions Compress Split C_Level 0x00100002 1 1852 0 0 Med 0x00100004 1 432 0 4 Med 0x00100004 2 C 698 15 1 Med 0x00100005 1 35 0 0 Med 0x00100005 2 0 0 0 Med ... |
Просмотр статистики очистки для разделов индекса (onstat -C clean)
Таблица 7. Описание столбцов в выводе "onstat -C clean"
| Partnum | Номер раздела индекса |
|---|---|
| Key | Номер ключа индекса |
| Dirty Hits | Значение hit-count для данного индекса |
| Clean Time | Время, затраченное на очистку (в секундах) |
| Pg_Examined | Количество просканированных страниц |
| Items Del | Количество удаленных элементов |
| Pages/Sec | Скорость сканирования (в страницах/сек) |
Листинг 4. Пример вывода "onstat -C clean"
B-tree Scanner Information Index Cleaned Statistics ========================= Partnum Key Dirty Hits Clean Time Pg Examined Items Del Pages/Sec 0x00100002 1 0 0 1 1 1.00 0x00100004 1 0 0 7 0 7.00 0x00100004 2 0 0 2 0 2.00 0x00100005 1 0 0 32 1564 32.00 0x00100005 2 0 0 13 558 13.00 ... |
Просмотр статистики range scan (onstat -C range)
Таблица 6. Описание столбцов в выводе "onstat -C range"
| Partnum | Номер раздела индекса |
|---|---|
| Key | Номер ключа индекса |
| Low | Нижний предел для данного индекса |
| High | Верхний предел для данного индекса |
| Size | Размер индекса в страницах |
| Saving | Процент времени, выигранный благодаря range scan, по сравнению с полным сканированием индекса |
Листинг 5. Пример вывода "onstat -C range"
B-tree Scanner Information Cleaning Range Statistics ========================= Partnum Key Low High Size Saving 0x0010001c 1 14 14 24 100.0 % 0x00100067 1 10 10 16 100.0 % 0x00100067 2 7 7 16 100.0 % 0x00100073 2 36 69 96 65.6 % 0x00100084 2 24 25 32 96.9 % 0x001000b1 2 36 36 112 100.0 % 0x001000e8 1 1 1 4 100.0 % 0x00100115 2 36 69 96 65.6 % 0x00100126 2 24 25 32 96.9 % 0x0010013d 1 2 2 75 100.0 % ... |
Просмотр статистики ALICE scan (onstat -C alice)
Таблица 9. Описание столбцов в выводе "onstat -C alice"
| Partnum | Номер раздела индекса |
|---|---|
| Mode | Номер режима ALICE для данного раздела индексаHey |
| BM_Sz | Размер битмапа для данного раздела индекса |
| Used_Pg | Количество использованных страниц в индексе |
| Examined | Количество страниц в данном индексе, обследованных сканером В-деревьев |
| Dirty_Pg | Количество "грязных" страниц, которые нашел сканер B-деревьев в данном индексе |
| # I/O | Количество страниц, прочитанных сканером B-деревьев |
| Found | Количество "грязных" страниц, найденных в прочитанных страницах |
| Eff | Эффективность битмапа |
| Adj | Текущее значение коэффициента приращения для данного битмапа |
Листинг 6. Пример вывода "onstat -C alice"
B-tree Scanner Information ALICE Cleaning Statistics ========================= System ALICE Info: Mode = 6, Eff = 30 %, Adj = 5 Partnum Mode BM_Sz Used_Pg Examined Dirty_Pg # I/O Found Eff Adj 0x001000b0 6 64 8 0 0 0 0 0.0 % 0 0x001000b1 6 64 8 0 0 0 0 0.0 % 0 0x001000b2 6 64 4 0 0 0 0 0.0 % 0 0x001000b2 6 64 4 0 0 0 0 0.0 % 0 0x001000b5 6 64 88 176 20 18 10 55.6 % 2 0x001000bb 6 64 88 0 0 0 0 0.0 % 0 0x001000bc 6 64 7 0 0 0 0 0.0 % 0 0x001000c4 6 64 26 0 0 0 0 0.0 % 0 ... |
Просмотр битмапа для режима ALICE (onstat -C map)
Таблица 10. Описание столбцов в выводе "onstat -C map"
| Partnum | Номер раздела индекса |
|---|---|
| Key | Номер ключа индекса |
| Map | Битмап для режима ALICE |
Листинг 7. Пример вывода "onstat -C map"
B-tree Scanner Information ALICE Bitmap of Deleted Index Items =================================== Partnum Key Map 0x001000b0 1 0000: 00000080 00000000 0x001000b1 1 0000: 00000080 00000000 0x001000b2 1 0000: 00000080 00000000 0x001000b2 2 0000: 00000080 00000000 0x001000b5 1 0000: 00000000 00000000 0x001000bb 1 0000: 00000080 00000000 0x001000bc 1 0000: 00000080 00000000 ... |
Пользователи IDS используют ключевое слово FILLFACTOR в выражении CREATE INDEX, определяющее степень заполнения индекса. Это позволяет учесть рост индекса в будущем. Также это позволяет создавать компактные индексы. После любой активности, связанной с DML (Data Modification Language), многие предпочитают, чтобы индексы были скомпрессированы до уровня компактности, указанного в FILLFACTOR. Степень заполнения индекса и компрессия индекса - связанные друг с другом понятия, но это не одно и то же. FILLFACTOR позволяет создать индекс с указанным количеством данных (в процентах) на каждой странице индекса. Тогда как при компрессии, IDS пытается объединить две частично использованные страницы индекса. Алгоритм сжатия индекса, который используется сканером В-деревьев, имеет установленный уровень компрессии около 80 процентов. Внешний интерфейс, который позволял бы изменить это значение, отсутствует.
В версии IDS 11.50.xC2 появились следующие возможности, связанные с компрессией индексов:
- Появилась возможность установки уровня компрессии для сканера В-деревьев на уровне инстанса. Уровней компрессии всего три: низкая (low), средняя (med) и высокая (high). Уровень компрессии по умолчанию равен med. Установить уровень компрессии можно с помощью новой опции параметра конфигурации BTSCANNER: compression=[low|med|high|default].
BTSCANNER num=4,threshold=10000,rangesize=-1,alice=6,compression=default
- Появилась возможность устновки уровня компрессии для отдельных разделов индексов. Теперь это можно сделать с помощью функций SQL Admin API task()/admin(): execute function task("set index compression", "index_partnum", "low|med|high|default");
Следующее выражение устанавливает уровень компрессии "high"
для индекса с номером раздела 1048967: EXECUTE FUNCTION ADMIN("set index compression", "1048967", "high"); Данное врыажением устанавливает уровень компрессии "low" для индекса "idx1" в базе данных "dbs1": SELECT TASK("set index compression", partn, "low") FROM dbs1:systables t, dbs1:sysfragments f WHERE f.tabid = t.tabid AND f.fragtype = 'I' AND indexname ='idx1';
- Уровень компрессии на уровне инстанса также может быть установлен с помощью команды onmode -C compression [low|med|high|default].
onmode -C compression high
- Текущие уровни компрессии (как глобальный, так и для отдельных индексов) теперь можно увидеть, выполнив команду onstat -C part.
Индивидуальные уровни компрессии индексов имеют приоритет над глобальным уровнем компрессии, указанном в файле конфигурации onconfig. Нововведения, связанные с компрессией не имеют влияния на миграцию с более ранних версий IDS на более новую, поскольку информация об уровне компрессии хранится в памяти, в структуре описывающей раздел индекса. Это также означает, что установленные уровни компрессии индексов не сохраняются после перезапуска сервера. У пользователей есть возможность создания задач для установки индивидуальных значений компресии для определенных индексов при запуске сервера IDS. Эти задачи можно создать используя Scheduler API.
Преимущества различных уровней компрессии зависят от природы DML-активности, связанной с конкретным индексом:
- Если индекс используется только для чтения или на 90% для чтения, высокая компрессия будет преимуществом, так как это позволит сократить количество операций ввода-вывода при поиске нужных данных. Сканер В-деревьев будет выполнять больше операций ввода-вывода для поддержания индекса в компактном состоянии, но это также значит, что запросы будут выполняться быстрей.
- Если индексы создаются со степенью заполнения ниже среднего, то имеет смысл установить минимальный уровень компрессии.
До появления сканера B-деревьев, очистка отмеченных для удаления элементов индекса была неэффективной и трудно контролируемой. Нить btscanner стала более гибким решением. Новый метод прост в администрировании и позволяет выполнять очистку более эффективно.
Теперь Вы должны уметь уверенно выбирать метод очистки индексов, подходящий для Вашей системы, конфигурировать btscanner c помощью файла конфигурации ONCONFIG, конфигурировать btscanner динамически с помощью утилиты "onmode", а также осуществлять мониторинг btscanner с использованием утилиты "onstat". Используйте эти знания, чтобы получить лучшую производительность транзакций на Вашем сервере Informix.
Научиться
-
IDS
V11.50 Information Center: Вся документация по IDS в формате HTML, оснащенная удобными средствами навигации и поиска.(EN)
-
developerWorks
Informix zone: Статьи и обучающие инструкции, которые могут быть полезны для приобретения навыков, связанных с Informix.(EN)
- developerWorks Information Management
Zone: Портал Information Management, содержащий техническую документацию, инструкции, информацию о продуктах, статьи и многое другое.
- Будьте в курсе
Событий и Вебкастов на developerWorks.(EN)
- Изучайте техническую литературу . (EN)
Получить продукты и технологии
-
Получите пробные версии, драйвера, исправления и патчи для продуктов IBM Informix.(EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- Откройте для себя
блоги на developerWorks и станьте членом сообщества
developerWorks. (EN)