问题描述
嗨,团队,
我一直在尝试更改表中的列的大小,该表是复合主键的一部分。当我尝试更改该特定列的大小时,我得到 “ORA-01404: ALTER列将使索引太大” 错误。您能否帮助我们了解为什么我们应该得到此错误以及如何验证索引的大小以解决此问题。谢谢!
我一直在尝试更改表中的列的大小,该表是复合主键的一部分。当我尝试更改该特定列的大小时,我得到 “ORA-01404: ALTER列将使索引太大” 错误。您能否帮助我们了解为什么我们应该得到此错误以及如何验证索引的大小以解决此问题。谢谢!
专家解答
每个索引条目 (来自索引列rowid的值) 必须能够放入索引块中。默认情况下,块为8,192字节。所以每个索引条目必须小于这个,减去一些间接费用。这大约是6,400个字节。
如果您尝试增加列的长度,那么您将遇到此错误,因此您可以存储的最大可能值大于此值。
例如,这试图从5,000 => 8,000扩展主键的长度,这太大而无法放入块中:
这与在太大的列上创建索引时可能出现的ORA-01450错误相同。我在以下位置讨论解决方案:
https://blogs.oracle.com/sql/how-to-fix-ora-01450-maximum-key-length-6398-exceeded-errors
您不能使用基于函数的索引来支持主键。虽然您可以将基于函数的索引隐藏在虚拟列后面,但这意味着虚拟列将在您的主键中。这可能会给您的应用程序增加太多的复杂性,使其无法工作。
因此,当涉及到主键列时,您的解决方法仅限于
* 使用较短的数据类型限制
* 创建具有更大块大小的表空间来存储这些索引
* 添加代理键,并在当前主键列上定义唯一的基于功能的索引
第一点可能看起来是不可行的 -- 毕竟所有的数据类型都必须足够大才能存储最大的价值 -- 但关键是要避免使用大的限制 “以防万一”。如果主键列之一是varchar2(4000),但最大存储字符串长度是100个字符,请考虑将该列缩小到一个小得多的上限。
如果您尝试增加列的长度,那么您将遇到此错误,因此您可以存储的最大可能值大于此值。
例如,这试图从5,000 => 8,000扩展主键的长度,这太大而无法放入块中:
create table t ( c1 varchar2(4000), c2 varchar2(1000), primary key ( c1, c2 ) ); alter table t modify c2 varchar2(4000); ORA-01404: ALTER COLUMN will make an index too large
这与在太大的列上创建索引时可能出现的ORA-01450错误相同。我在以下位置讨论解决方案:
https://blogs.oracle.com/sql/how-to-fix-ora-01450-maximum-key-length-6398-exceeded-errors
您不能使用基于函数的索引来支持主键。虽然您可以将基于函数的索引隐藏在虚拟列后面,但这意味着虚拟列将在您的主键中。这可能会给您的应用程序增加太多的复杂性,使其无法工作。
因此,当涉及到主键列时,您的解决方法仅限于
* 使用较短的数据类型限制
* 创建具有更大块大小的表空间来存储这些索引
* 添加代理键,并在当前主键列上定义唯一的基于功能的索引
第一点可能看起来是不可行的 -- 毕竟所有的数据类型都必须足够大才能存储最大的价值 -- 但关键是要避免使用大的限制 “以防万一”。如果主键列之一是varchar2(4000),但最大存储字符串长度是100个字符,请考虑将该列缩小到一个小得多的上限。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




