(19) 临时表使用的两个极端
2013-12-16 11:50
148 查看
Oracle的临时表在PL/SQL 中功能非常强大,特别是复杂的那种存储过程,非常好用。 但检查开发人员的代码时发现对其使用常见到两种极端。
一种是从不使用临时表,直接不用或用普通表来做这个功能
一种是会点TSQL的,喜欢把SQL Server的经验套过来,但忽视了数据库不同,使用方式是有差异的。
在说之前,归例要普及下Oracle临时表的相关知识和使用时机,然后再说说这两种极端。
一。相关知识
临时表有两种类型:
会话级的临时表
会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你
退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。
例子:
事务级的临时表
事务级临时表是指该临时表与事务相关, 当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。
例子:
二。使用时机
临时表的优点是不占空间,数据也会自动清空。还可以建索引。所以在代码中用得很多的,常见的使用场景如下:
当你编程时,发现你的需求要有多张表关联,并且这些表大部分都是比较庞大,而你通过拆分业务逻辑,把某几张表关联之后得到的小结果集,存入到临时表,能很好的提高性能和使整个程序的逻辑更清晰。
另外一种情况是,有些临时数据必须在整个会话期间都存在。但会话关闭时又希望它跟着消失。也可以用临时表来做。
三。吐槽
一种是不使用临时表,直接不用或用普通表来做这个功能
这种开发,有些是不知道有这个功能,还有些是老开发了,认为Oracle的自定义类型,如表,数组什么的完全够用,实在碰到要使用的情况时,就建个普通表来存放。
自已管理其insert和delete。 但他们忽视了普通表的开销及增加了代码复杂度。而且会在数据库中留下一些不属于表设计范围,纯为了代码而建的表。
一种是会点TSQL的,喜欢把SQL Server的经验套过来,但忽视了数据库不同,使用方式是有差异的。
这种通常在有TSQL开发经验转过来的人身上很常见。你去看看SQL Server数据库作后台的应用看看。你会发
现临时表在那用得令人发指,到处都是。 所以这批人在PL/SQL下时,会习惯性的狂用临时表也不足为奇了。
他们完全忽视应用的场景及PL/SQL灵活强大的自定义类型和复合类型。
常见的错误体现在两方面。
a. 在可以使用复合类型的记录或表实现时,使用了临时表
b. 在使用临时表时,并没有去认真研究,而像上面说的一样,使用普通来代替实现。
附注:
Oracle复合数据类型包括:
-记录
-表
-嵌套表
-数组
在项目开发过程中,除了临时表,相信还有很多情况要引起注意,所以
DBA必须在开发过程中多关注代码的质量,多审查一下提交的代码。
不然越到后面,影响越大,一不小心更改错了业务逻辑或引起性能问题可不是好玩的。
MAIL:xcl_168@aliyun.com
Blog:http://blog.csdn.net/xcl168
一种是从不使用临时表,直接不用或用普通表来做这个功能
一种是会点TSQL的,喜欢把SQL Server的经验套过来,但忽视了数据库不同,使用方式是有差异的。
在说之前,归例要普及下Oracle临时表的相关知识和使用时机,然后再说说这两种极端。
一。相关知识
临时表有两种类型:
会话级的临时表
会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你
退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。
例子:
create global temporary table tmp_xcl_session (id number(5), name varchar2(20)) on Commit Preserve Rows ;
事务级的临时表
事务级临时表是指该临时表与事务相关, 当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。
例子:
create global temporary table tmp_xcl_trans (id number(5), name varchar2(20)) on Commit delete Rows ;
二。使用时机
临时表的优点是不占空间,数据也会自动清空。还可以建索引。所以在代码中用得很多的,常见的使用场景如下:
当你编程时,发现你的需求要有多张表关联,并且这些表大部分都是比较庞大,而你通过拆分业务逻辑,把某几张表关联之后得到的小结果集,存入到临时表,能很好的提高性能和使整个程序的逻辑更清晰。
另外一种情况是,有些临时数据必须在整个会话期间都存在。但会话关闭时又希望它跟着消失。也可以用临时表来做。
三。吐槽
一种是不使用临时表,直接不用或用普通表来做这个功能
这种开发,有些是不知道有这个功能,还有些是老开发了,认为Oracle的自定义类型,如表,数组什么的完全够用,实在碰到要使用的情况时,就建个普通表来存放。
自已管理其insert和delete。 但他们忽视了普通表的开销及增加了代码复杂度。而且会在数据库中留下一些不属于表设计范围,纯为了代码而建的表。
一种是会点TSQL的,喜欢把SQL Server的经验套过来,但忽视了数据库不同,使用方式是有差异的。
这种通常在有TSQL开发经验转过来的人身上很常见。你去看看SQL Server数据库作后台的应用看看。你会发
现临时表在那用得令人发指,到处都是。 所以这批人在PL/SQL下时,会习惯性的狂用临时表也不足为奇了。
他们完全忽视应用的场景及PL/SQL灵活强大的自定义类型和复合类型。
常见的错误体现在两方面。
a. 在可以使用复合类型的记录或表实现时,使用了临时表
b. 在使用临时表时,并没有去认真研究,而像上面说的一样,使用普通来代替实现。
附注:
Oracle复合数据类型包括:
-记录
-表
-嵌套表
-数组
在项目开发过程中,除了临时表,相信还有很多情况要引起注意,所以
DBA必须在开发过程中多关注代码的质量,多审查一下提交的代码。
不然越到后面,影响越大,一不小心更改错了业务逻辑或引起性能问题可不是好玩的。
MAIL:xcl_168@aliyun.com
Blog:http://blog.csdn.net/xcl168
相关文章推荐
- (19) 临时表使用的两个极端
- 在两个activity之间使用intent传递list类型的对象
- 19、新手入手树莓派教程--4*4矩阵按键模块的使用
- 使用两个嵌套for循环和取余操作符%来探测和打印素数
- 关于使用cvCalcEMD2计算两个直方图间最小工作距离的限制(Why cvCalcEMD2 Throw Insufficient Memory Exception)
- 交换两个变量的值,不使用第三个变量
- 使用Imagenet VGG-19模型进行图片识别
- 不使用中间变量来交换两个变量的值
- 使用临时表进行性能优化
- OC学习笔记19--copy与mutableCopy的使用
- 解决easyui-tabs中使用iframe时出现两个垂直滚动条
- LeetCode 笔记系列 19 Scramble String [合理使用递归]
- Java中使用==和使用equals来比较两个字符串的区别
- 写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷
- 游戏编程入门(19):使用演示模式展示游戏
- 【C语言】【unix c】如何使用管道实现两个进程间的通信
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
- easyui中使用两个嵌套的 tabs 时页面无法出现滚动条
- 【题目5】如何使用两个栈来实现一个队列
- static_cast和reinterpret_cast这两个操作符有什么区别,应该怎么使用这两个操作符