ora-01450是索引维护中可能会出现的错误。首先通过oerr来看一下01450的相关信息:
SQL> ho oerr ora 01450
01450, 00000, "maximum key length (%s) exceeded"
// *Cause:
// *Action:
呵呵,oracle竟然没有给出合理建议。但是从字面意义可以看出,01450是由于我们的关键字超出了某些限定值而引起的。oracle不推崇单条索引记录占用较大的存储空间,在9i之前的版本,oracle规定每个数据块至少存放两条完整索引记录,在9i之后条件放宽,每个数据块至少存放一条完整索引记录。毫无疑问,在数据块中除去索引记录本身的数据,还存储了一些辅助信息(大概占用了192个字节),除此之外,每条索引记录还包含了除key值之外的附加信息,如rowid等。因此,在创建索引时,被索引列的长度是受限制的,大概范围为(blocksize-192)*80%。
下面我们来验证一下:
在8k的表空间中:被索引列的长度不可以超过 (8192-192)*0.8=6400
SQL> create tablespace ts8k datafile '/oracle/app/oradata/easy/e01.dbf' size 10m blocksize 8192;
表空间已创建。
SQL> create table t8(c1 varchar2(1000),c2 varchar2(2000),c3 varchar2(3000),c4 varchar2(4000));
表已创建。
SQL> create index ind8 on t8(c1,c2,c3,c4);
create index ind8 on t8(c1,c2,c3,c4)
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (6398)
SQL> create index ind8 on t8(c2,c3,c4);
create index ind8 on t8(c2,c3,c4)
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (6398)
SQL> create index ind8 on t8(c1,c2,c3);
索引已创建。
在16k的表空间中:被索引列的长度不可以超过 (16384-192)*0.8=12593.6
SQL> create tablespace ts16k datafile '/oracle/app/oradata/easy/s01.dbf' size 10m blocksize 16384;
表空间已创建。
SQL> create table t16(c1 varchar2(4000),c2 varchar2(4000),c3 varchar2(4000),c4 varchar2(4000)) tablespace ts16k;
表已创建。
SQL> create index ind16 on t16(c1,c2,c3,c4) tablespace ts16k;
create index ind16 on t16(c1,c2,c3,c4) tablespace ts16k
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (12958)
SQL> create index ind16 on t16(c1,c2,c3) tablespace ts16k;
索引已创建。
我想到这里,大家肯定对ora-01450有了基本的认识。
下面我们rebuild一下索引:
SQL> alter index ind8 rebuild;
索引已更改。
SQL> alter index ind8 rebuild online;
alter index ind8 rebuild online
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01450: 超出最大的关键字长度 (3215)
非常奇怪的现象,通过online重建索引再次报01450错误,并且长度的上限为3215,而不是与8k对应的6398。这是因为,rebuild online的过程中,oracle会创建索引组织表IOT.下面我们手动创建索引组织表:
CREATE TABLE "TIO8"
("C1" VARCHAR2(4000 BYTE),
"C2" VARCHAR2(4000 BYTE),
"C3" VARCHAR2(4000 BYTE),
"C4" VARCHAR2(4000 BYTE),
CONSTRAINT "TIOC" PRIMARY KEY ("C1") ENABLE
) Organization Index Nocompress Pctfree 10 Initrans 2 Maxtrans 255 Logging
Tablespace "TS8K"
Pctthreshold 51 Overflow
10 TABLESPACE "TS8K" ;
Pctthreshold 51 Overflow
*
第 9 行出现错误:
ORA-25179: 无效的 PCTTHRESHOLD 存储选项值
CREATE TABLE "TIO8"
("C1" VARCHAR2(4000 BYTE),
"C2" VARCHAR2(4000 BYTE),
"C3" VARCHAR2(4000 BYTE),
"C4" VARCHAR2(4000 BYTE),
CONSTRAINT "TIOC" PRIMARY KEY ("C1") ENABLE
) Organization Index Nocompress Pctfree 10 Initrans 2 Maxtrans 255 Logging
Tablespace "TS8K"
Pctthreshold 50 Overflow
10 TABLESPACE "TS8K" ;
CREATE TABLE "TIO8"
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (3215)
我想到这里大家肯定明白了,索引组织表的pctthreshold不可以大于50,即每个数据块中至少包含两条记录,那么索引的长度上限就变为:(8192-192)*0.8*0.5=3200
再来看一下blocksize为16k的情况:
SQL>
CREATE TABLE "TIO16"
("C1" VARCHAR2(4000 BYTE),
"C2" VARCHAR2(4000 BYTE),
"C3" VARCHAR2(4000 BYTE),
"C4" VARCHAR2(4000 BYTE),
CONSTRAINT "TIOC" PRIMARY KEY ("C1") ENABLE
) Organization Index Nocompress Pctfree 10 Initrans 2 Maxtrans 255 Logging
Tablespace "TS16K"
Pctthreshold 50 Overflow
10 TABLESPACE "TS16K" ;
CREATE TABLE "TIO16"
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (3800)
在32k的blocksize下,最大关键字长度也是3800
SQL>
CREATE TABLE "TIO32"
("C1" VARCHAR2(4000 BYTE),
"C2" VARCHAR2(4000 BYTE),
"C3" VARCHAR2(4000 BYTE),
"C4" VARCHAR2(4000 BYTE),
CONSTRAINT "TIOC" PRIMARY KEY ("C1") ENABLE
) Organization Index Nocompress Pctfree 10 Initrans 2 Maxtrans 255 Logging
Tablespace "TS32K"
Pctthreshold 50 Overflow
10 TABLESPACE "TS32K" ;
CREATE TABLE "TIO32"
*
第 1 行出现错误:
ORA-01450: 超出最大的关键字长度 (3800)
看来在索引组织表中,被索引关键字的长度具有一个‘hard limit’即3800.
分享到:
相关推荐
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查。使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查 使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查
创建物化视图ORA-12014错误解决方法 创建物化视图ORA-12014错误解决方法
Drop goldengate用户时,报ORA-00604 ORA-20782 ORA-06512错误
【DATAGUARD】物理dg配置客户端无缝切换 (八.4)--ora-16652 和 ora-16603错误【DATAGUARD】物理dg配置客户端无缝切换 (八.4)--ora-16652 和 ora-16603错误
Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法
oracle数据库ora-01152和ora-01110的解决办法
ora-03113错误
oracle网络配置(listener_ora-sqlnet_ora-tnsnames_ora).mht
关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明
用oracle数据库新建连接时遇到ora-12505,此问题解决后又出现ora-12519错误,郁闷的半天,经过一番折腾问题解决,下面小编把我的两种解决方案分享给大家,仅供参考。 解决方案一: 今天工作时在新建连接的时候遇到...
在oracle里面运行一下,解决Exception java.sql.SQLException ORA-00600 内部错误代码
ORA-12560 TNS 协议适配器错误
在运行查询SELECT * FROM V$SESSION 会出现ORA-29275:部分多字节字符的错误,这是什么原因开始我不得其解,网上也没有介绍什么好办法。本文给出答案。
如果内存块仍然不够满足需求,那么就会出现ORA- 04031错误。这些错误同样可能发生在ASM的实例中。默认的共享池的大小基本能够满足大部分的环境,但是如果遇到ORA-04031错误的时候可能就需要增大。 当遇到这个错误的...
ERwin连接oracle报ORA-01041内部错误,hostdef扩展名不存在解决办法,实验可解决问题。
ORACLE ORA-00132 ORA-00214
oracle启动失败,ORA-00702报错,windows,linux系统下解决办法
离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法,在解决ORA-01033的过程中,又出现ORA-01145 * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 接着的解决步骤