马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
进行大数据量的DML时,数据处置惩罚会很慢,甚至数据处置惩罚直接卡死。对此优化的本领之一就是先将表在DML中查询用不到的索引置为无效以及nologging,DML处置惩罚完后再将这索引重建。
1 新建存储要置为无效的索引的暂时表
- create global temporary table TMP_VACHAR_LIST
- (
- text VARCHAR2(4000)
- )
- on commit preserve rows;
复制代码 2 将索引置为无效,数据处置惩罚后重建索引
- begin
- EXECUTE IMMEDIATE 'TRUNCATE TABLE TMP_VACHAR_LIST';
- --记录下来非唯一性约束,插入数据后要重建
- INSERT INTO TMP_VACHAR_LIST
- SELECT t.INDEX_NAME
- FROM user_indexes t
- where t.TABLE_NAME = 'TEST'
- and t.uniqueness = 'NONUNIQUE'
- and t.index_type = 'NORMAL';
- --先将原表索引 unusable 以及nologging,加快DML数据速度
- for ff in (SELECT t.INDEX_NAME, t.UNIQUENESS, t.index_type
- FROM user_indexes t
- where t.TABLE_NAME = 'TEST'
- and t.index_type = 'NORMAL') loop
- --将非唯一性约束索引 unusable
- if ff.uniqueness = 'NONUNIQUE' then
- l_sqltext := 'alter index ' || ff.INDEX_NAME || ' unusable ';
- else
- --将唯一性约束索引 nologging
- --不能将唯一性约束unusable,因为会导致表插入不了数据
- l_sqltext := 'alter index ' || ff.INDEX_NAME || ' nologging';
-
- end if;
- execute immediate L_SQLTEXT;
-
- end loop;
- /*
- ---------------------------------
- 此处省略对TEST表的DML处理SQL
-
- ---------------------------------
- */
- --重建索引
- for ff in (SELECT text FROM TMP_VACHAR_LIST t) loop
- l_sqltext := 'alter index ' || ff.text ||
- ' rebuild online parallel 8 nologging';
- execute immediate L_SQLTEXT;
- end loop;
- end;
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |