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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值