设为首页 收藏本站
查看: 524|回复: 0

[经验分享] Oracle中中的临时表(工作中使用真实表)

[复制链接]
YunVN网友  发表于 2016-8-13 07:24:17 |阅读模式
  
  
 1、前言
  目前所有使用oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。
  当然在oracle中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在oracle中创建“临时表”。
  我对临时表的理解:在oracle中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在oracle系统的临时表空间中(temp)。
  2、临时表的创建
  创建oracle临时表,可以有两种类型的临时表:会话级的临时表和事务级的临时表。   
  1)会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前session不退出的情况下,临时表中的数据就还存在,而当你退出当前session的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个session登陆的时候是看不到另外一个session中插入到临时表中的数据的。即两个不同的session所插入的数据是互不相干的。当某一个session退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表创建方法:
  
create global temporary table table_name(col1 type1,col2 type2...)
  on commit preserve rows;
  举例:
  create global temporary table student(stu_id number(5),class_id number
(5),stu_name varchar2(8),stu_memo varchar2(200)) on commit preserve rows ;
  2)事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出session的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:
  create global temporary table table_name(col1 type1,col2 type2...)
on commit delete rows;
  举例:
  create global temporary table classes(class_id number(5),class_name varchar2
(8),class_memo varchar2(200)) on commit delete rows ;
  3)、两种不通类型的临时表的区别:语法上,会话级临时表采用on commit preserve rows而事务级则采用on commit delete rows;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是commit、rollback或者是会话结束,临时表中的数据都将被截断。
  3、例子:
  1)、会话级(session关闭掉之后数据就没有了,当commit的时候则数据还在,当rollback的时候则数据也是一样被回滚):
  insert into student(stu_id,class_id,stu_name,stu_memo) values(1,1,''张三'',''福建'');insert into student(stu_id,class_id,stu_name,stu_memo) values(2,1,''刘德华'',''福州'');insert into student(stu_id,class_id,stu_name,stu_memo) values(3,2,''s.h.e'',''厦门'');sql> select *from student ;
    stu_id class_id stu_name stu_memo
    1 1 张三 福建2 1 刘德华 福州3 2 s.h.e 厦门4 2 张惠妹 厦门
    sql> commit;
    commit complete
    sql> select * from student ;
    stu_id class_id stu_name stu_memo
    1 1 张三 福建2 1 刘德华 福州3 2 s.h.e 厦门4 2 张惠妹 厦门
    sql>insert into student(stu_id,class_id,stu_name,stu_memo) values(4,2,''张惠妹'',''厦门'');
    1 row inserted
    sql> select * from student ;
    stu_id class_id stu_name stu_memo
    1 1 张三 福建2 1 刘德华 福州3 2 s.h.e 厦门4 2 张惠妹 厦门4 2 张惠妹 厦门
    sql> rollback ;
    rollback complete
    sql> select * from student ;
    stu_id class_id stu_name stu_memo
   1 1 张三 福建2 1 刘德华 福州3 2 s.h.e 厦门4 2 张惠妹 厦门
  2)、事务级(commit之后就删除数据):
    本例子将采用以下的数据:
  insert into classes(class_id,class_name,class_memo) values(1,''计算
机'',''9608'');insert into classes(class_id,class_name,class_memo)
values(2,''经济信息'',''9602'');insert into classes
(class_id,class_name,class_memo) values(3,''经济信息'',''9603'');
  在一个session中(比如sqlplus登陆)插入上面3条记录,然后再以另外一个session(用sqlplus再登陆一次)登陆,当你select * from classes;的时候,classes表是空的,而你再第一次登陆的sqlplus中select的时候可以查询到,这个时候你没有进行commit或者rollback之前你可以对刚才插入的3条记录进行update、delete等操作,当你进行commit或者rollback的时候,这个时候由于你的表是事务级的临时表,那么在插入数据的session也看不到数据了,这个时候数据就已经被截断了。
  运行结果如下:
  sql> insert into classes(class_id,class_name,class_memo)
values(1,''计算机'',''9608'');
    1 row inserted
    sql> insert into classes(class_id,class_name,class_memo)
values(2,''经济信息'',''9602'');
    1 row inserted
    sql> insert into classes(class_id,class_name,class_memo)
values(3,''经济信息'',''9603'');
    1 row inserted
    sql> update classes set class_memo ='''' where class_id=3 ;
    1 row updated
    sql> select * from classes ;
    class_id class_name class_memo
1 计算机 96082 经济信息 96023 经济信息
    sql> delete from classes where class_id=3 ;
    1 row deleted
    sql> select * from classes ;
    class_id class_name class_memo
1 计算机 96082 经济信息 9602
    sql> commit;
    commit complete
    sql> select *from classes ;
    sql> 再重复插入一次,然后rollback。
   sql> rollback ;
    rollback complete
    sql> select * from classes ;
  4、临时表的应用
  1)、当某一个sql语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
  2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
  5、注意事项:
  1)、临时表的索引以及对表的修改、删除等和正常的表是一致的。
  2)、oracle的临时表是oracle8i才支持的功能特性,如果你的oracle版本比较低的话,那么就可能没有办法用到了,如果你的oracle版本是8i的话,你还需要把$oracle_home/admin/$/pfile目录下的init<oracle_sid>.ora初始参数配置文件的compatible修改为compatible = "8.1.0",我的服务器上就是这样子配置的。当然也可以修改为compatible = "8.1.6"
  以上是我在对大表进行优化的时候采用的一些手段,效果显著。
  
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newhappy2008/archive/2009/02/26/3940766.aspx
  
  
  但是在实际的应用中,我们创建真是的表进行临时的存取! 每天自动跑一边存储过程,把数据放入到表中,然后前台进行显示!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257114-1-1.html 上篇帖子: ORACLE主要的系统表和系统视图——转载 下篇帖子: 在Java中执行Oracle分页的存储过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表