临时表(Temporary Table)

本文介绍了Oracle数据库中临时表的概念及创建方法,包括会话级和事务级两种类型的临时表,并探讨了它们之间的区别及应用场景。此外,还提出了一种增强型临时表的设计方案,以克服Oracle临时表的一些限制。

   目前所有使用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或者是会话结束,临时表中的数据都将被截断
 
4)什么时候使用临时表
 
1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中
2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
 
 
3.例子:略

4.临时表的不足之处

 
    1)不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2)不支持主外键关系

 
所以,由于以上原因,我们可以自己创建临时表,以弥补oracle临时表的不足之处

 
上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

 
   创建方法:

      1、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID <NUMBER> 列以区分不同的会话。(可以有lob列和主外键)

2、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录(SessionID等于本次会话ID的记录)。

3、程序写入数据时,要顺便将当前的会话ID(SessionID)写入表中。

4、程序读取数据时,只读取与当前会话ID相同的记录即可。

   功能增强的扩展设计:
  1、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID。
  2、数据表中的SessionID列可以通过Trigger实现,以实现对应用层的透明性。
  3、高级用户可以访问全局数据,以实现更加复杂的功能。
  扩展临时表的优点:
  1、实现了与Oracle的基于会话的临时表相同的功能。
  2、支持SDO_GEOMETRY等lob数据类型。
  3、支持表间的主外键连接,且主外键连接也是基于会话的。
  4、高级用户可以访问全局数据,以实现更加复杂的功能

 

<think>好的,我现在要帮用户介绍“创建临时表 create table as”这个主题。首先,我需要确定用户的具体需求是什么。可能他们是在学习SQL,特别是在处理临时数据时如何创建临时表。用户可能希望了解语法、使用场景以及注意事项。 首先,我得回忆一下不同数据库系统(比如MySQL、PostgreSQLSQL Server)对临时表的支持是否一致。因为不同系统可能有细微差别,比如临时表的生命周期和可见范围。比如,在MySQL中,临时表仅在当前会话存在,会话结束后自动删除,而PostgreSQL也有类似的行为,但语法可能略有不同。 接下来,用户提到的“create table as”这种语法,应该是使用CREATE TEMPORARY TABLE ... AS SELECT的语句。这时候需要解释基本语法结构,并给出一个例子。比如,从一个现有表中选择数据创建临时表。 然后,需要考虑用户可能的使用场景。比如,在复杂查询中存储中间结果,或者在事务处理中暂时保存数据,避免影响主表。还要提醒用户临时表的限制,比如权限问题,临时表通常只在当前会话可见,不同会话即使创建同名的临时表也不会冲突。 另外,注意事项部分也很重要。比如,临时表的存储位置可能和普通表不同,性能方面的考虑,以及不同数据库系统的兼容性问题。比如,SQL Server使用SELECT INTO的语法来创建临时表,可能需要特别说明。 用户可能还会想知道临时表的自动清理机制,是否需要手动删除,或者是否在会话结束自动删除。这也是需要提到的点,因为如果不了解这点,可能会产生疑惑,比如为什么表不存在了。 另外,可能需要提到临时表的索引和约束。创建临时表时是否可以添加索引,或者是否需要像普通表一样定义。例如,在创建临时表后,可以进一步创建索引来提高查询性能。 还要考虑示例的通用性,是否需要涵盖多个数据库系统,或者专注于某一个。可能用户没有指定,所以应该以通用的语法为例,同时指出不同系统的差异。 最后,确保回答结构清晰,分点说明,比如基本语法、使用场景、注意事项、示例等。这样用户能够逐步理解,并应用到实际中。同时,检查是否有遗漏的重要点,比如临时表的命名空间,是否与普通表冲突,或者事务中的行为(如回滚是否影响临时表)。 总结下来,回答的结构应该是: 1. 定义和作用 2. 基本语法 3. 使用场景 4. 示例 5. 注意事项 6. 不同数据库的差异 这样用户能够全面了解如何创建临时表,并有效使用。同时,避免使用过于专业的术语,保持解释的易懂性,必要时通过示例来辅助说明。</think>### 创建临时表(CREATE TABLE AS)详解 #### 1. **基本语法** 在 SQL 中,使用 `CREATE TEMPORARY TABLE AS` 可以通过现有表或查询结果快速创建临时表临时表仅在当前会话有效,会话结束后自动删除。 通用语法如下: ```sql CREATE TEMPORARY TABLE 临时表名 AS SELECT 列1, 列2, ... FROM 原表 WHERE 条件; ``` #### 2. **核心作用** - **临时存储数据**:存储中间计算结果,减少复杂查询的重复计算。 - **会话隔离**:不同会话的同名临时表互不影响。 - **性能优化**:通过预计算或缓存中间数据加速查询。 #### 3. **典型使用场景** - **复杂查询分步处理** 例如:从订单表中筛选数据并计算聚合值: ```sql CREATE TEMPORARY TABLE temp_orders AS SELECT customer_id, SUM(amount) AS total FROM orders WHERE order_date >= '2023-01-01' GROUP BY customer_id; -- 后续基于临时表进一步查询 SELECT * FROM temp_orders WHERE total > 1000; ``` - **事务处理中间结果** 在事务中暂存数据,避免直接修改主表。 #### 4. **注意事项** - **生命周期**:临时表在会话关闭或连接终止时自动删除。 - **命名冲突**:临时表与普通表可同名,但优先访问临时表。 - **权限限制**:通常需要 `CREATE TEMPORARY TABLES` 权限。 - **数据库差异**: - **MySQL**:支持 `TEMPORARY` 关键字。 - **PostgreSQL**:临时表默认保存在 `pg_temp` 模式。 - **SQL Server**:使用 `INTO #临时表名` 语法(如 `SELECT ... INTO #temp`)。 #### 5. **扩展操作** - **添加索引** 创建临时表后,可单独为其添加索引提升性能: ```sql CREATE INDEX idx_temp ON temp_orders(customer_id); ``` - **手动清理** 可显式删除临时表(非必需): ```sql DROP TEMPORARY TABLE IF EXISTS temp_orders; ``` #### 6. **完整示例** ```sql -- 创建临时表存储高消费用户 CREATE TEMPORARY TABLE high_value_customers AS SELECT c.customer_id, c.name, SUM(o.amount) AS lifetime_spent FROM customers c JOIN orders o ON c.customer_id = o.customer_id GROUP BY c.customer_id HAVING SUM(o.amount) > 5000; -- 从临时表查询结果 SELECT * FROM high_value_customers ORDER BY lifetime_spent DESC; ``` #### 7. **性能建议** - 对大数据量查询创建临时表时,建议添加过滤条件(如 `WHERE`)减少数据量。 - 频繁使用的中间结果可考虑添加合适索引。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值