Множество системных номеров

При создании таблицы пользователь (явно или неявно) задает параметр MAXROWID, определяющий максимальный системный номер записи таблицы и влияющий на эффективность работы СУБД ЛИНТЕР. В каждый момент времени множество системных номеров записей (ROWID) любой таблицы разделено на три подмножества:

  1. подмножество ROWID, занятых под номера записей;

  2. подмножество ROWID удаленных записей;

  3. подмножество еще неиспользованных (свободных) ROWID.

Стратегия использования этих подмножеств следующая:

  • при удалении записи ее ROWID переходит в подмножество удаленных номеров;

  • при добавлении записи ей присваивается первый неиспользованный ROWID, если подмножество неиспользованных ROWID не пусто, в противном случае первый ROWID из подмножества удаленных записей.

При создании таблицы все ROWID являются неиспользованными.

Новой записи присваивается первый (наименьший) неиспользованный ROWID. Это будет происходить до полного исчерпания подмножества неиспользованных ROWID, после чего номер для записи СУБД будет искать среди ROWID удаленных записей, что делает процедуру добавления менее эффективной.

Таким образом, пользователь при работе с таблицей может с какого-то момента обнаружить небольшие замедления при загрузке данных, что будет означать начало переиспользования ROWID удаленных записей. При переполнении таблицы (после того, как подмножества неиспользуемых и удаленных ROWID стали пустыми), СУБД приступает к расширению конвертера (на одну страницу), т.е. к увеличению параметра MAXROWID (на 1022 номера).

При наличии большого числа удаленных записей рекомендуется выполнять сжатие таблицы (с помощью специального SQL-запроса). При сжатии таблицы СУБД производит перенумерацию записей и все ROWID удаленных записей переводит в конец подмножества неиспользованных ROWID. Следовательно, число номеров (параметр MAXROWID) выгоднее задавать с некоторым «запасом», чтобы приходилось реже запускать процедуру сжатия. Однако этот запас не должен быть слишком большим, иначе СУБД придется использовать длинные бит-векторы ответов и это может снизить общую эффективность работы СУБД.

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