database - 为 DB2 中的现有表添加表空间
问题描述
我在我的项目中使用 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/create-index-for-long-columns
解决方案
您可以在下一个更高的页面大小中重新创建表以避免此问题。
我假设您使用的是 4Kb 页面大小的表空间(这是默认值),因此下一个更高的页面大小是 8KB。
创建(或重新使用合适的现有)一个 8KB 页面大小的缓冲池(CREATE BUFFERPOOL)创建(或重新使用合适的现有)一个 8KB 表空间(CREATE TABLESPACE)以使用匹配页面大小的新缓冲池。
如果表中已包含您不想重新加载的数据,则使用存储过程ADMIN_MOVE_TABLE将现有数据移动到新表空间。
如果表不包含行(或可以快速重新加载),则删除表并使用修改后的 DDL 重新创建以添加IN $your_8kb_tablespace
.
如果表将包含数百万行,明智的做法是将其拆分为三个表空间(一个用于数据,一个用于索引,一个用于长数据) - 您也可以使用create table
语句执行此操作,请参阅文档以获取详细信息。
对于非常大的表,如果许可和硬件允许,请考虑使用范围分区和哈希分区。
推荐阅读
- python - 如何在不更改值的情况下更改数据框列名?
- javascript - 创建类的实例以调用静态方法
- r - 我不知道我的 CARET 模型是分类还是回归?
- ruby - 如何在一个动作中使用变量到另一个动作
- python - 如果连接的组合是素数,则接受用户输入并打印
- amazon-web-services - 如何使用 Cloudwatch Event 执行 Lambda 代理集成
- mongodb - 从字符串 Mongodb 的末尾删除子字符串
- couchdb - 如何从超级账本结构中查看或检索数据
- sql - Pivot sql 输出 - Google sql 面试题
- laravel - 访问 Laravel 中的许多页面后重定向到预期的 url