为 DB2 中现有的 table 添加 table 空间
Add tablespace for existing table in DB2
我在我的项目中使用 DB2。我有一个 table,其中包含以下 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],它解释了添加大的 table 空间来为长列创建索引。但这是针对新 table 的。为现有 table 添加它的正确方法是什么?
[1] https://dba.stackexchange.com/questions/19894/create-index-for-long-columns
SQL0614N 的 documentation 清楚地解释了这一点,4K 页面大小 table 空间允许最大 1K key-length,8KB 页面大小 table 空间允许最大 2k 密钥长度, 16KB 页面大小允许最大 4k key-length, 32kb 页面大小允许最大 8kb 密钥长度。
您可以在下一个更高的页面大小中重新创建 table 以避免此问题。
我假设您使用的是 4Kb 页面大小 table空间(这是默认值),因此下一个更高的页面大小是 8KB。
创建(或 re-use suitable 现有)一个 8KB 页面大小的缓冲池 (CREATE BUFFERPOOL )
创建(或 re-use suitable 现有)8KB table 空间 (CREATE TABLESPACE) 以使用匹配页面大小的新缓冲池。
如果 table 已经包含您不想重新加载的数据,则使用存储过程 ADMIN_MOVE_TABLE 将现有数据移动到新的 table 空间.
如果 table 不包含任何行(或可以快速重新加载),则删除 table 并使用修改后的 DDL 重新创建以添加 IN $your_8kb_tablespace
.
如果 table 将包含数百万行,明智的做法是将其拆分为三个 table 空间(一个用于数据,一个用于索引,一个用于长数据)- 您可以也可以使用 create table
语句执行此操作,有关详细信息,请参阅文档。
对于非常大的 table,如果许可和硬件允许,请考虑使用 range-partitioning 和 hash-partitioning。
我在我的项目中使用 DB2。我有一个 table,其中包含以下 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],它解释了添加大的 table 空间来为长列创建索引。但这是针对新 table 的。为现有 table 添加它的正确方法是什么?
[1] https://dba.stackexchange.com/questions/19894/create-index-for-long-columns
SQL0614N 的 documentation 清楚地解释了这一点,4K 页面大小 table 空间允许最大 1K key-length,8KB 页面大小 table 空间允许最大 2k 密钥长度, 16KB 页面大小允许最大 4k key-length, 32kb 页面大小允许最大 8kb 密钥长度。
您可以在下一个更高的页面大小中重新创建 table 以避免此问题。
我假设您使用的是 4Kb 页面大小 table空间(这是默认值),因此下一个更高的页面大小是 8KB。
创建(或 re-use suitable 现有)一个 8KB 页面大小的缓冲池 (CREATE BUFFERPOOL ) 创建(或 re-use suitable 现有)8KB table 空间 (CREATE TABLESPACE) 以使用匹配页面大小的新缓冲池。
如果 table 已经包含您不想重新加载的数据,则使用存储过程 ADMIN_MOVE_TABLE 将现有数据移动到新的 table 空间.
如果 table 不包含任何行(或可以快速重新加载),则删除 table 并使用修改后的 DDL 重新创建以添加 IN $your_8kb_tablespace
.
如果 table 将包含数百万行,明智的做法是将其拆分为三个 table 空间(一个用于数据,一个用于索引,一个用于长数据)- 您可以也可以使用 create table
语句执行此操作,有关详细信息,请参阅文档。
对于非常大的 table,如果许可和硬件允许,请考虑使用 range-partitioning 和 hash-partitioning。