大数目的DML时对索引处置惩罚的本领

打印 上一主题 下一主题

主题 1777|帖子 1777|积分 5331

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
进行大数据量的DML时,数据处置惩罚会很慢,甚至数据处置惩罚直接卡死。对此优化的本领之一就是先将表在DML中查询用不到的索引置为无效以及nologging,DML处置惩罚完后再将这索引重建。
1 新建存储要置为无效的索引的暂时表
  1. create global temporary table TMP_VACHAR_LIST
  2. (
  3.   text VARCHAR2(4000)
  4. )
  5. on commit preserve rows;
复制代码
2 将索引置为无效,数据处置惩罚后重建索引
  1. begin
  2.   EXECUTE IMMEDIATE 'TRUNCATE TABLE TMP_VACHAR_LIST';
  3.   --记录下来非唯一性约束,插入数据后要重建
  4.   INSERT INTO TMP_VACHAR_LIST
  5.     SELECT t.INDEX_NAME
  6.       FROM user_indexes t
  7.      where t.TABLE_NAME = 'TEST'
  8.        and t.uniqueness = 'NONUNIQUE'
  9.        and t.index_type = 'NORMAL';
  10.   --先将原表索引 unusable 以及nologging,加快DML数据速度
  11.   for ff in (SELECT t.INDEX_NAME, t.UNIQUENESS, t.index_type
  12.                FROM user_indexes t
  13.               where t.TABLE_NAME = 'TEST'
  14.                 and t.index_type = 'NORMAL') loop
  15.     --将非唯一性约束索引 unusable
  16.     if ff.uniqueness = 'NONUNIQUE' then
  17.       l_sqltext := 'alter index ' || ff.INDEX_NAME || ' unusable ';
  18.     else
  19.       --将唯一性约束索引 nologging
  20.       --不能将唯一性约束unusable,因为会导致表插入不了数据
  21.       l_sqltext := 'alter index ' || ff.INDEX_NAME || ' nologging';
  22.    
  23.     end if;
  24.     execute immediate L_SQLTEXT;
  25.   
  26.   end loop;
  27.   /*
  28.   ---------------------------------
  29.    此处省略对TEST表的DML处理SQL        
  30.   
  31.   ---------------------------------
  32.   */
  33.   --重建索引
  34.   for ff in (SELECT text FROM TMP_VACHAR_LIST t) loop
  35.     l_sqltext := 'alter index ' || ff.text ||
  36.                  ' rebuild online parallel 8 nologging';
  37.     execute immediate L_SQLTEXT;
  38.   end loop;
  39. end;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表