问题:
一张数据量较大的表,当前的状态为:行数774,422,平均行长度3158 byte,占用了6778.4MB的表空间。表空间由该表单独占用,目前已使用了3903867个db block,浪费了2045253个db block。数据空间的浪费比例超过了50%。
对该表的操作主要是insert及update,update操作包括对VARCHAR2字段的修改,但是其长度不会改变。其间做过两次数据库row的成批delete,但是释放出的空间极少。
这种情况是如何产生的,应该怎样避免?
相关信息:
数据库的db block设置为2K
出现问题的表为pay_dtl,其DDL如下:
create table pay_dtl
(
dtl_sq number(10) not null,
batch_id char(7) not null,
type_cd char(10) not null,
sub_key1_cd char(20) not null,
sub_key2_cd char(20) not null,
sub_key3_cd char(20) not null,
int_user_id char(10) not null,
open_brh_id char(10) not null,
acct_id char(19) not null,
user_nm char(30) not null,
curr_bal_at number(12,2) default 0 not null,
int_base_at number(9,3) default 0 not null,
user_id_cd char(2) not null,
ext_user_id char(30) not null,
int_brh_id char(10) not null,
tot_fee_at number(9,2) default 0 not null,
delay_at number(9,2) default 0 not null,
delay_cal_dt char(8) not null,
prev_delay_at number(9,2) default 0 not null,
act_delay_at number(9,2) default 0 not null,
punish_at number(9,2) default 0 not null,
prev_punish_at number(9,2) default 0 not null,
act_punish_at number(9,2) default 0 not null,
pay_month_dt char(8) not null,
account_dt char(8) not null,
send_dt char(8) not null,
confirm_in char(1) default 'N' not null,
del_in char(1) default 'N' not null,
frozen_in char(1) default 'N' not null,
receipt_prt_qt number(1) default 0 not null,
receipt_id char(30) not null,
open_mode_cd char(1) not null,
txn_brh_id char(10) not null,
txn_dt char(8) not null,
int_txn_seq_id char(10) not null,
txn_sta_cd char(1) default '0' not null,
int_reply_cd char(2) not null,
log_txt varchar2(2000) not null,
misc_tx varchar2(1024) not null,
last_upd_opr_id char(10) not null,
global_txn_id char(10) not null,
last_upd_ts date not null
)
storage(initial 512K next 1000K pctincrease 0) pctfree 5 pctused 95 tablespace dtl_dt;
目前该表已有Extents: 5521个。