Я использую DB2 в своем проекте. У меня есть таблица со следующим DDL:
CREATE TABLE TEST (
ID INTEGERT NOT NULL,
ACCESS_INFO VARCHAR (2048) NOT NULL,
NAME VARCHAR (2048))
При попытке создать индекс для столбца «ACCESS_INFO» я получаю следующую ошибку:
The index or index extension "xxxx" cannot be created or altered because the combined length of the specified columns is too long..
Я ссылался на [1], в котором объясняется, как добавить большое табличное пространство для создания индексов для длинных столбцов. Но это для новых столов. Каков правильный способ добавить его для существующей таблицы?
[1] https://dba.stackexchange.com/questions/19894/создать-индекс-для-длинных-столбцов
@mao, ОС - Linux
документация для SQL0614N ясно объясняет это: табличное пространство размером страницы 4 КБ допускает максимальную длину ключа 1 КБ, табличное пространство размера страницы 8 КБ допускает максимальную длину ключа 2 КБ, размер страницы 16 КБ допускает максимальную длину ключа 4 КБ, размер страницы 32 КБ допускает максимальную длину ключа 8 КБ.
Вы можете воссоздать свою таблицу в следующем большем размере страницы, чтобы избежать этой проблемы.
Я предполагаю, что вы используете табличное пространство размером 4 КБ (это значение по умолчанию), поэтому следующий больший размер страницы составляет 8 КБ.
Создайте (или повторно используйте подходящий существующий) буферный пул размером 8 КБ (СОЗДАТЬ БУФЕРНЫЙ БАССЕЙН) Создайте (или повторно используйте подходящее существующее) табличное пространство размером 8 КБ (СОЗДАТЬ ТАБЛИЧНОЕ ПРОСТРАНСТВО), чтобы использовать новый буферный пул соответствующего размера страницы.
Если таблица уже содержит данные, которые вы не хотите перезагружать, используйте хранимую процедуру ADMIN_MOVE_TABLE для перемещения существующих данных в новые табличные пространства.
Если в таблице нет строк (или ее можно быстро перезагрузить), удалите таблицу и создайте ее заново с измененным DDL, чтобы добавить IN $your_8kb_tablespace
.
Если таблица будет содержать много миллионов строк, целесообразно разделить ее на три табличных пространства (одно для данных, одно для индексов, одно для длинных данных) — вы также можете сделать это с помощью оператора create table
, подробности см. в документации. .
Для очень больших таблиц рассмотрите возможность использования секционирования по диапазону и секционирования по хэшу, если это позволяют лицензия и аппаратное обеспечение.
Что такое операционная система сервера Db2 (z/OS, i-series, Linux/Unix/Windows)?