近日生产出现性能告警,经过一番排查发现一条SQL没有使用索引,对其创建索引时报ora-01450
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01450: maximum key length (3215) exceeded
于是查看表结构发现一个十分恼火的问题,所有字段全是varchcar2(4000)
关于“key length (3215)”是因为Oracle中要求一个数据块(通常是8KB)存储一行完整的记录,而一个数据块除了数据信息外,还有一些辅助信息(大致占用192字节),此外数据块中还包含一些附加信息,如rowid,所以一个数据块大致可用为(8192-192)*80%=6400,
对于create index …online 或 alter index …rebuild onlien,Oracle需要先创建一个索引组织表,那么可用空间就是原来的一半,大致为3200。
对于varchcar2(4000)字段就无法在8KB表空间创建索引
解决方式:
1.修改表字段为实际使用大小(改小),需要停业务,但是不能应急–建议
2.创建一个16k表空间,并创建索引,这算是一个应急手段,但是使用16k块容易引发热点快争用。
alter system set db_16k_cache_size=2m;
alter system set db_cache_size=20M
create tablespace ind_tbs_16k datafile size 30G block_size 16k;
create index index_name on table_name(columns) on tablesapce ind_tbs_16k ;