Oracle临时表 优化查询速度

2016-02-19 18:46 4 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的Oracle临时表 优化查询速度,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

  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或者是会话结束,临时表中的数据都将被截断。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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 张惠妹   厦门

SQLinsert 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 张惠妹   厦门

SQL

    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');

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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 计算机     9608
       2 经济信息   9602
       3 经济信息  

SQL delete from classes where class_id=3 ;

1 row deleted

SQL select * from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------
       1 计算机     9608
       2 经济信息   9602
SQL commit;

Commit complete

SQL select *from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------

SQL
再重复插入一次,然后rollback。
SQL Rollback ;

Rollback complete

SQL select * from classes ;

CLASS_ID CLASS_NAME CLASS_MEMO
-------- ---------- --------------------------------------------------------------------------------

SQL

  4、临时表的应用

    1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。

    2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

  5、注意事项:

    1)、临时表的索引以及对表的修改、删除等和正常的表是一致的。

    2)、Oracle的临时表是Oracle8i才支持的功能特性,如果你的Oracle版本比较低的话,那么就可能没有办法用到了,如果你的Oracle版本是8i的话,你还需要把$ORACLE_HOME/admin/${ORACLE_SID}/pfile目录下的initORACLE_SID.ora初始参数配置文件的compatible修改为compatible = "8.1.0",我的服务器上就是这样子配置的。当然也可以修改为compatible = "8.1.6"

  以上是我在对大表进行优化的时候采用的一些手段,效果显著。

来源:http://www.tulaoshi.com/n/20160219/1618892.html

延伸阅读
当你执行管理员优化的时候,应该紧记以下规则: · 访问内存中的数据快于访问磁盘上的数据。 · 尽量把数据保存在内存中可以减少磁盘操作。 · 保留索引中的信息比保留数据记录的内容更重要。 我们在后面将讨论如何应用这些规则。 增加服务器缓存的大小。服务器拥有很多参数(系统变量),你可以改变这些参数来影...
标签: 电脑入门
Windows优化大师对于开机速度的优化主要通过减少引导信息停留时间和取消不必要的开机自运行程序来提高电脑的启动速度。 用户在设置开机自启动程序时,可点击展开列表中的项目,Windows优化大师会显示与该程序相关的说明或建议。 注1:点击打开资源管理器,并定位到该文件所在目录,可通过资源管理器直接定位到该启动项所在的目录。便于高级用...
    前面讲了ORACLE性能调优原则,但是可能有许多朋友不知道ORACLE优化机理到底是什么?下面作一简单说明。     解释     先说明一下,ORACLE有一个优化器(Optimizer),ORACLE的优化机理就是从Optimizer开始的。     明确两个概念:Optimizer 对ORACLE的优化方式有两种,一...
    TNS服务器被看作Oracle的逻辑数据请求中的绝缘体和远程服务器间的服务器。同样的,网络管理员有能力控制网络性能调谐性,但是Oracle管理员没有控制影响数据库性能的网络设置的权利。     可以利用下面我所说的重要的设置来改变分布式事物元的性能。其中包括了sqlnet.ora, tnsnames.ora, 和 protocol.ora文...
表空间是oracle数据库中最大的逻辑单位与存储空间单位,数据库系统通过表空间为数据库对象分配空间。表空间在物理上体现为磁盘数据文件,每一个表空间由一个或多个数据文件组成,一个数据文件只可与一个表空间相联系,这是逻辑与物理的统一。了解表空间和数据文件的的属性及使用率,是数据库管理员的一项重要职责。下面以oracle9i为例,详...

经验教程

817

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部