В ряде случаев при загрузке информационной базы в 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К. Ну и тем более, еще раз подумать, насколько необходим столь "тяжелый" индекс в вашей конфигурации.