Cканер В-деревьев в Informix Dynamic Server

Усовершенствованная очистка индексов в IDS

Сканер В-деревьев является одним из элементов функционала IBM® Informix® Dynamic Server (IDS), который отвечает за очистку "грязных" элементов индекса и компрессию листьев В-дерева. Благодаря данной статье Вы станете лучше понимать принципы работы сканера В-деревьев, а также узнаете способы использования данной возможности для получения оптимальной производительности при обработке транзакций.

Сринат Дувуру, инженер по программному обеспечению, IBM

Сринат Дувуру работает разработчиком IBM Informix Dynamic Server в команде Kernel/Performance.



Мирав Кападья, инженер по программному обеспечению, IBM

Мирав Кападья работает разработчиком IBM Informix Dynamic Server в команде Kernel/Performance.



19.02.2010

Введение

Сканер В-дереьев появился в 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
ОпцияЗначение по-умолчанию Описание
num1Количество нитей btscanner, которые будет запущены при старте IDS.
threshold5000Количество элементов, с которыми должен столкнуться сканер, прежде чем индек будет добавлен в список очистки hot-list.
rangesize-1Минимальный размер фрагмента индекса (в страницах), необходимый для использования range scans.
alice6Режим ALICE (для всего инстанса).
compressiondefaultУровень компрессии для сканера 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

Будучи к режиме leaf scan, нить btscanner начинает сканирование с левой крайней страницы-листа (leaf page) индекса и сканирует все страницы-листья, очищая их от удаленных элементов. Этот метод хорошо применим в случае небольшого размера индекса, когда большинство страниц находится в буферном пуле (buffer pool), или же в случае привязанного (attached) индекса.

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

Range scan

В сравнении с leaf scan, range scan не читает всех страниц-листьев индекса. Вместо этого сканер В-деревьев отслеживает младшую и старшую логические страницы индекса, содержащие удаленные элементы. Механизм range scan читает только страницы-листья в этом диапазоне. Также, при сканировании диапазона страницы читаются блоками по 128 страниц с использованием light scans. Эти страницы записываются в буферный пул и очищаются от удаленных элементов.

Метод range scan существенно превосходит leaf scan, поскольку выполняет меньше операций ввода-вывода, читая только часть страниц индекса. Также он зачастую обходит буферный пул благодаря механизму light scans. Но несмотря на это, в некоторых экстремальных ситуациях, младшая и старшая страницы могут быть соответственно в начале и в конце индекса, так что весь индекс попадает в диапазон сканирования. Это приведет к лишним операциям ввода-вывода.

ALICE Scan

Начиная с версии 10.00.xC5, IDS поддерживает новый режим очистки индексов - Автономная Линейная Очистка Индексов (Autonomic Linear Index Cleaning). Его суть заключается в следующем: страницы фрагментов индекса группируются в так называемые регионы, которые в свою очередь состоят из блоков равной величины. Каждому региону ставится в соответствие бит на специальном битмапе. При обнаружении отмеченного для удаления элемента индекса, устанавливается значение бита соответствующего региона. Таким образом, сканер В-деревьев сканирует только те регионы, чьи биты отмечены в битмапе.

Например:

Таблица 3. Пример для режима ALICE scan
P1, P2 .... P256P257, P258 .... P512P513, P514 .... P768P769, P770 .... P1024
Index Region No. 1Index Region No. 2Index Region No. 3Index Region No. 4
Bit No. 1Bit No. 2Bit No. 3Bit 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 бит.



Мониторинг сканера B-деревьев

Суммарный профайл (onstat -C)

Таблица 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 
...

Enhancements in 11.50.xC2

Пользователи 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.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=468830
ArticleTitle=Cканер В-деревьев в Informix Dynamic Server
publish-date=02192010