(这段是后面添加的:临时表,在实际应用中,其实和nologging的固定表,是差不多的,都是中间表,所以这里为什么添加这段话,是让自己记得,如果不创建临时表,而是使用固定表,来作为中间表的话,要记得将这个表改为nologging,否则会产生很多日志出来,没有必要,将固定表改为nologging,很简单:alter table xxx nologging就可以了,这个我已经用dba_tables查过了,确实起作用)。
oracle的临时表,global temporary table。
注意的是:这个临时表,不保存数据,其数据变化也不记入日志。
所以一般是在程序中,临时保存数据用的,也就是保存在操作过程中临时用到的数据,包括一些统计中间数据,或者临时生成的字典等等。
由于其数据变化不计入日志,所以在统计程序或者临时的字典的使用,可以很好的避免产生不必要的日志。
比fixed table好很多,因为固定表要产生日志,带来很多不必要的存储负载。
推荐程序中用到的临时数据,尽量保存到临时表中,因为1、临时表隔离度更高,只有用户自己可见;2、用户用过,oracle系统会自动删除数据,不需要增加额外的代码。
经过实际操作发现,临时表和固定表的操作方式,是一样的,权限方面也是差不多的,只不过一个是临时用的,用过就没有数据了,而且不产生日志,固定表是永久保存数据,产生日志,也可以建立索引、触发器等,也可以创建同义词。也就是说相差不远。
临时表,分为两种,一种是基于会话的,一种是基于事务,两者之间有区别,会话指的程序尚在登录期间,程序和数据库之间的会话存在,基于事务的,指的是事务期间。
基于会话的临时表,在创建的时候,指定on commit preserve rows,就是基于会话的临时表,这里面的数据,在程序和数据库之间的会话存在期间,数据一直保存,不删除,从这方面考虑,可以认定这个方式可以用于生成程序使用的临时字典之类的。
基于事务的临时表,在创建的时候,指定on commit delete rows,就是基于事务的临时表,这种表,要对事务有所了解才能使用,事务指的是产生的一个insert、update、delete之类的动作,不是select,事务的完成和关闭,以当前用户的commit动作为结束,当用户程序发出commit命令,oracle就会删除临时表中的数据。这个特性,非常适合用于查询程序过程中,产生的统计中间数据,当统计程序过于复杂,程序无法一次性完成统计动作,或者为了减轻数据库和程序之间的数据来往负担,可以将统计出来的数据临时存放在临时表中,然后将结果查询到程序界面,在完成将结果抓取到程序界面上后,再发出commit命令,就可以清空临时表。
在我实际编写的统计程序中,因为临时表选择的问题,统计结果翻倍,所以我认为,查询统计程序,最好使用基于事务的临时表,在将统计结果抓取到程序界面上后,发出commit命令,就可以完成当前事务,从而删除临时表中的数据。这也就是为了避免一个操作上的失误,导致的统计错误,就是多点几下按钮,在基于会话的临时表,或者在程序中没有发出commit命令结束事务,多点几下按钮,会导致临时表中的数据,多次插入,那样当然统计结果也就错了。
最后记录下,后台操作语句:
create global temporary table xxxx(xxx varchar2(10),xxxxx varchar2(20));
grant all on xxxx to role_xxx;
至于选择表的问题,可以创建同义词,也就是使用system.xxxx ,这两种方式。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9606200/viewspace-1435675/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9606200/viewspace-1435675/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)