Ошибка SQL0614N - Индекс или расширение индекса «ИМЯ_ИНДЕКСА» нельзя создать или изменить

Краткое содержание:

В ряде случаев при загрузке информационной базы в DB2 возникает ошибка SQL0614N "Индекс или расширение индекса «ИМЯ_ИНДЕКСА» нельзя создать или изменить, поскольку общая длина указанных столбцов превышает допустимый предел." (The index or index extension index-name cannot be created or altered because the combined length of the specified columns is too long.) В данной статье будет рассмотрена причина возникновения данной ошибки и пути ее решения.

В ряде случае при загрузки информационной базы в DB2 или обновлении конфигурации, возникает ошибка SQL0614N "Индекс или расширение индекса «ИМЯ_ИНДЕКСА» нельзя создать или изменить, поскольку общая длина указанных столбцов превышает допустимый предел." (Английской вариант сообщения: "The index or index extension index-name cannot be created or altered because the combined length of the specified columns is too long".)

Причина возникновения данной ошибки в следующем.

Все индексы 1С хранятся в табличном пространстве V81C_INDEXSPACE. По-умолчанию, 1С создаёт данное табличное пространство с размером страницы в 8К, что ограничивает размер записи индекса в 2К. Ниже приведена таблица соответствия размера страницы табличного пространства DB2 и максимальной длины ключа индекса.

Макс. длина ключа
Размер страницы
 1K  4K
 2K  8K
 3K  16K
 4K  32K

Более подробно устройство табличных пространств DB2 для информационной базы 1С будет рассмотрено в отдельной статье. Пока лишь ограничимся замечанием, что размер страницы 8К для индексного табличного пространства был выбран исходя из оптимальных параметров производительности для конфигураций 1С.

Что делать в случае возникновения ошибки

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

Если же такой индекс все-таки необходим, то требуется пересоздать индексное табличное пространство с V81C_INDEXSPACE с большим размером страницы. Ниже приведен сценария DB2, который пересоздает табличное пространство с размером страницы 16К.

Копировать в буфер обмена
DROP TABLESPACE "V81C_INDEXSPACE";
DROP BUFFERPOOL "V81C_INDEXBP";
CREATE BUFFERPOOL "V81C_INDEXBP" SIZE AUTOMATIC PAGESIZE 16K;
CREATE LARGE TABLESPACE "V81C_INDEXSPACE" PAGESIZE 16K MANAGED BY DATABASE
     USING (FILE 'V81C_INDEXSPACE\space.1' 2048,
            FILE 'V81C_INDEXSPACE\space.2' 2048)
     EXTENTSIZE 2
     PREFETCHSIZE AUTOMATIC
     BUFFERPOOL V81C_INDEXBP
     AUTORESIZE YES
     MAXSIZE NONE
     NO FILE SYSTEM CACHING
     DROPPED TABLE RECOVERY OFF;

Сценарий создания табличного пространства с максимальным размером страницы в 32К идентичен сценарию выше. Достаточно в 3 и 4 строках указать 32К вместо 16К.

Общая последовательность шагов по модификации базы данных будет выглядеть следующим образом.

1. Выгрузить существующую базу в .dt
2. Создать новую базу данных средствами 1С.
3. Выполнить сценарий создания табличного пространства либо в центре управления DB2, либо при помощи командной строки DB2. В последнем случае текст сценария надо сохранить в файл, скажем newindex.clp, после чего выполнить команду, 

Копировать в буфер обмена
db2 -tvf newindex.clp

предварительно соединившись с базой данных.

Если и после этого у вас возникает ошибка, то следует повторить сценарий создания табличного пространства с максимальным размером страницы в 32К. Для этого достаточно в 3 и 4 строках указать 32К вместо 16К. Ну и тем более, еще раз подумать, насколько необходим столь "тяжелый" индекс в вашей конфигурации.