有的时候在数据维护的时候,往往会导致一些非常严重的逻辑性错误,例如避免丢失更新,千万不要认为update中a.userid=b.userid就万事大吉。如果一定要用游标方式来进行更新,切记使用临时表来做循环,而不用原表来实现循环,以最大限度的避免ORA-01555错误的发生。
另外在高并发环境下,对于DDL操作一定要慎之又慎,比如对一个表增加约束,如果操作不慎可能会阻塞select 语句的操作,因为此时在share pool解析语句的时候,不能获得对象的句柄,因此造成了library cache pin的等待事件,语句处于等待解析过程中,从而阻塞了读。可以有两种方法来解决该问题:
1.online创建一个唯一索引,然后增加约束,使用using index index_name选项,这样在删除约束的时候会自动删除索引。
2.创建非唯一索引,然后增加约束,使用using index index_name novalidate,这个过程中不会阻塞读,最后alter table ....modify constraint constraint_name validate。
上面提到了增加索引,增加索引可能导致应用走了错误的执行计划,如果新建立的索引没有分析,这就会导致一些SQL语句认为这个执行计划会更好,要解决这样的问题,只要在建立索引的时候增加compute statistics就可以了;但是如果你要修改一个索引的列,不能只就drop原来的索引,再增加一个新的索引,如果哦表很大的话,就可能导致在新的索引建立好之前,相关的应用无法使用该索引,比较好的办法是,先online方式创建并分析索引,然后drop index,最后rename to,这样对应用的影响就小的多了。直方图的建立建议建立在比较恒定的列上,不要建立在日期型的列上,并且该列上发生很多update操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/48620/viewspace-400044/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/48620/viewspace-400044/