暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORA-01450: maximum key length (3215) exceeded问题处理

原创 small_A 2021-10-25
2098

近日生产出现性能告警,经过一番排查发现一条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)
image.png
关于“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 ;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论