`

oracle临时表-优化查询速度

阅读更多

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

分享到:
评论

相关推荐

    Oracle优化, 优化查询速度,目前所有使用Oracle作为数据库支撑平台的应用

    Oracle临时表 优化查询速度,目前所有使用Oracle作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

    ORACLE9i_优化设计与系统调整

    §9.4.4 临时表空间设计规划 100 §9.4.5 数据文件和日志文件在不同磁盘上 101 §9.5 数据库物理设计 101 §9.5.1 定量估计 101 §9.5.2 表空间与数据文件 102 §9.5.3 物理设计原则 103 §9.5.4 数据库物理设计内容...

    21天学通Oracle

    第18章 数据库速度优化与数据完整性(教学视频:32分钟) 332 第19章 数据一致性与事务管理(教学视频:46分钟) 341 第20章 并发控制(教学视频:35分钟) 356 第21章 Oracle中的正则表达式(教学视频:29分钟)...

    Oracle数据库管理员技术指南

    7.8.7 恢复丢失的临时表空间 7.8.8 只读表空间丢失 7.8.9 索引表空间丢失 7.9 恢复联机重做日志 7.9.1 联机重做日志组某个成员丢失 7.9.2 非活动的重做日志组丢失 7.9.3 活动重做日志组丢失 7.10 恢复丢失的...

    收获不知Oracle

    4.2.3.3 全局临时表两大重要特性 149 4.2.4 神通广大的分区表 153 4.2.4.1 分区表类型及原理155 4.2.4.2 分区表最实用的特性 165 4.2.4.3 分区索引类型简述176 4.2.4.4 分区表之相关陷阱177 4.2.5 有趣的索引组织表 ...

    (重要)AIX command 使用总结.txt

    AIX常用命令://查看机器序列号,IBM的基本信息都可以通过该命令查询得到 #prtconf #oslevel -r == uname -a //操作系统版本 #oslevel //查看操作系统版本ex :5.1.0.0 #oslevel -r //ex:5100-04 == oslevel -q //...

    sql语句优化之SQL Server(详细整理)

    MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。...

    Toad 使用快速入门

     注意,如果是选择了专门建立toad这个用户的话,需要先修改一下脚本,指定用户的默认表空间和临时表空间。 需要使用Oracle8i 的Profile analyzer,必须运行ToadProfiler.sql  需要加强Toad的安全性,必须...

    Oracle存储过程的编写经验与优化措施(分享)

    如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过...

    C#开发经验技巧宝典

    0915 如何使用临时表 535 0916 如何查询表中的列名 535 0917 在查询中如何防止输入指定符串 536 0918 查询指定长度的数据 536 0919 获取当前数据库的详细信息 537 0920 在查询过程中灵活定义与使用别名 ...

    asp.net知识库

    可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...

    关于数据库优化问题收集汇总

    在对它们进行适当的优化后,其运行速度有了明显地提高! 下面将从这三个方面分别进行总结: 为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(&lt; 1秒)。—- 测试环境: 主机:HP...

    网管教程 从入门到精通软件篇.txt

    如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。  format  将指定的驱动器...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 &lt;br&gt;1.1 Visual Studio开发环境安装与配置 2 &lt;br&gt;0001 安装Visual Studio 2005开发环境须知 2 &lt;br&gt;0002 配置合适的Visual Studio 2005...

Global site tag (gtag.js) - Google Analytics