Oracle优化, 优化查询速度,目前所有使用Oracle作为数据库支撑平台的应用
### Oracle优化:提升查询速度与临时表应用 在当前众多基于Oracle数据库的应用系统中,尤其是一些处理大量数据(通常为百万级别以上)的系统,提高查询效率是至关重要的任务之一。本文将深入探讨如何利用Oracle临时表来优化查询速度,并提供具体的实现策略。 #### 一、Oracle临时表的基本概念及应用场景 Oracle临时表是一种特殊类型的表,它们主要用于存储临时数据,这些数据通常在一次会话(session)中创建并在该会话结束时自动删除。与常规表不同的是,临时表中的数据对于不同的会话而言是隔离的,即一个会话中对临时表所做的修改不会影响其他会话中的数据。这种特性使得临时表非常适合用于存储临时结果集或者执行复杂的查询操作。 #### 二、临时表的类型及其特点 Oracle临时表有两种主要类型:全局临时表(GTT)和局部临时表(LTT)。这里我们主要讨论全局临时表,因为它更适用于大型系统中的数据处理。 - **全局临时表 (GTT)**: - **On Commit Preserve Rows**:当事务提交(commit)后,数据仍然保留在表中。这意味着即使事务已经提交,临时表中的数据也不会被清除,除非会话结束或者显式地执行删除操作。 ```sql 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; ``` - **On Commit Delete Rows**:当事务提交后,临时表中的数据会被自动清除。这种方式适合于不需要保存中间结果的情况。 ```sql create global temporary table Classes ( Class_id Number(5), Class_Name Varchar2(8), Class_Memo varchar2(200) ) on commit delete rows; ``` #### 三、Oracle临时表的使用示例 下面通过一个具体的例子来说明如何使用Oracle临时表: 假设我们需要创建一个全局临时表`Student`,用于存储学生的信息,并且希望在每次提交后保留表中的数据: ```sql 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; -- 插入数据 insert into Student (Stu_id, Class_id, Stu_Name, Stu_Memo) values (1, 1, '张三', '学生信息'); ``` 接下来,我们可以查看表中的数据,并进行提交操作: ```sql select * from Student; -- 提交事务 commit; ``` 可以看到,即使在提交事务后,`Student`表中的数据依然存在。 #### 四、临时表的高级用法 除了基本的使用方法之外,Oracle临时表还支持一些高级特性,如: - **索引**: 可以为临时表创建索引,进一步提高查询性能。 - **分区**: 对于非常大的数据集,可以考虑使用分区技术来管理临时表。 - **并发控制**: 临时表支持多种并发控制机制,确保在多用户环境中的一致性和准确性。 #### 五、总结 通过本文的介绍,我们可以看到Oracle临时表作为一种高效的工具,在处理大规模数据时能够显著提升查询性能。无论是通过`On Commit Preserve Rows`还是`On Commit Delete Rows`方式,都能够根据实际需求灵活选择合适的策略。同时,结合索引和分区等高级特性,可以进一步增强临时表的功能性和性能表现。在日常开发工作中,合理利用这些特性将会大大提高系统的整体效率和用户体验。
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 张三 ? ? 福建
剩余5页未读,继续阅读
- zhangfuxiang19902013-04-16似乎不能实现效果,感觉不好
- gaochao70022013-05-10谢谢分享,对性能优化还是有点作用的
- 粉丝: 2
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip