zoukankan      html  css  js  c++  java
  • [转载]ORACLE临时表的创建

    原文地址:ORACLE临时表的创建作者:ALTER
    简要说明:
    Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中。
    目前几乎所有使用Oracle作为数据库支撑平台的应用,大部分都是数据量比较庞大的系统,即表的数据量一般情况下是在百万以上。
    当然在Oracle创建分区是一种不错的选择,但是当你发现你的应用一有多张表关联的时候,并且这些表大部分都是比较庞大,而你的关联的时候发现其中的某一张或者某几张表关联之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我们将考虑在Oracle中创建临时表

    临时表通俗说明:
    在Oracle中创建一张表,这个标不用与其他的什么功能,主要用于自己的软件系统一些有特有功能采用,而当你用完之后,表中的数据就没有用了,Oracle的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空间的时候,你插入的临时表的数据是存放在Oracle的系统默认临时表空间中的(TEMP)

    临时表的使用:
    临时表分为两种类型:
    1、会话级别的临时表
    2、事物级别的临时表

    1、会话级的临时表
    会话级的临时表因为这个临时表中的数据和你当前会话有关系,当你的当前session不退出的情况下,临时表中的数据就还存在,而当你退出了当前的session,临时表中的数据就全部都没有了,当然这个时候如果以另外一个session登录的时候是看不到另外一个session中插入到临时表中的数据的。即两个不同的session所插入的数据是互不相干的。当某一个session退出之后临时表中的数据就被截断(truncate table)。
    创建格式:
    create global temporary table table_name
    (col type,col2 type.....) on commit preserve rows;
    ex > 
    create global temporary table student(
    no number(5),
    class number(5),
    name varchar2(8)
    ) on commit preserve rows;
    2、事务级临时表
    事务级的临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自动被截断,其他内容和会话级别的临时表一致(包括退出session)
    创建格式:
    create global temporary table table_name
    (col1 type,col2 type) on commit delete rows;
    ex >
    create global temporary table classes(
    class_id number(5),
    class_name varchar2(8)
    ) on commit delete rows;

    二者的区别:
    会话级别临时表采用on commit preserve rows;事务级别采用on commit delete rows
    会话级别只有在会话结束,临时表中的数据才会别截断;而事务级别的临时表则是不管是commit、rollback或者是会话结束,临时表中的数据都会被截断

    什么时候使用临时表比较合适?
    1、当一个sql语句关联的表在2张及两张以上,并且和一些小表关联,可以采用将大表进行拆分并且得到比较小的结果集存放到临时表中
    2、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用到

    一下结构是临时表所不支持的:
    1、lob对象
    2、主外键关系

    由于临时表不支持主外键关系,我们可以创建自己的临时表,以弥补临时表的不足之处
    1、以常规方式创建临时数据表的结构,但是在每一个表的逐渐中加入一个sessionID以区分不同的会话(可以有lob列和主外键)
    2、写一个用户注销触发器,在用户结束会话之后,删除本次会话所插入的所有记录(sessionID等于本次会话的id)
    3、程序写入数据时,要顺便将当前的会话id写入表中
    4、程序读取数据时,只读取当前会话id相同的记录
    增强型:
    1、可以在数据表上创建一个视图,视图记录的筛选条件就是当前会话的SessionId
    2、数据表中的SessionID列可以通过Trigger实现
    3、高级用户可以访问全局数据,以实现更加复杂的功能

  • 相关阅读:
    C#操作REDIS例子
    A C# Framework for Interprocess Synchronization and Communication
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    开源项目选型问题
    Mysql命令大全——入门经典
    RAM, SDRAM ,ROM, NAND FLASH, NOR FLASH 详解(引用)
    zabbix邮件报警通过脚本来发送邮件
    centos启动提示unexpected inconsistency RUN fsck MANUALLY
    rm 或者ls 报Argument list too long
    初遇Citymaker (六)
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480273.html
Copyright © 2011-2022 走看看