在
DB2
存储过程开发中经常使用临时表。合理的使用临时表可以简化程序的编写,提供执行效率,然而滥用临时表同样也会使得程序运行效率降低。
临时表一般在如下情况下使用:
临时表用于存储程序运行中的临时数据。例如,如果在一个程序中第一条查询语句执行的结果会被后续的查询语句用到,那么我们可以把第一次查询的结果存储在一个临时表中供后续查询语句使用,而不是在后续查询语句中重新查询一次。如果第一条查询语句非常复杂和耗时,那么上面的策略是非常有效的。
临时表可以用于存储在一个程序中需要返回多次的结果集。例如,程序中有一个很耗资源的多表查询,同时,该查询在程序中需要执行多次,那么就可以把第一次查询的结果集存储在临时保中,后续的查询只需要查临时表就可以了。
临时表也可以用于让
SQL
访问非关系型数据库。例如,可以编写程序把非关系型数据库中的数据插入到一个全局临时表中,那么我们就可以对其数据进行查询。
我们可使用
DECLARE GLOBAL TEMPORARY TABLE
语句来定义临时表。
DB2
的临时表是基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在
SYSCAT.TABLES
中出现
下面是定义临时表的一个示例:
创建有两个字段的临时表
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP2
(
ID
INTEGER default 3,
NAME
CHAR(30)
)
--WITH REPLACE
NOT LOGGED;
--IN USER_TEMP_01;
|
此语句创建了一个有两个字段的临时表。
理论上临时表是不需要显示
DROP
的,因为它是基于会话的,当临时表基于的连接关闭的时候,临时表也就不存在了。但是在实际开发中会有一些情况需要我们对临时表加以注意。
一种情况就是被调用的存储过程的返回值是一个基于临时表的结果集。当存储过程执行完毕的时候,临时表并不会消失,因为返回的结果集相当于一个指针,指向临时表所在的内存地址,此时临时表是不会被
DROP
掉的。这种情况下,既不能在存储过程中删除这个临时表,也不应该由客户应用显示的删除临时表,这就容易出现一些问题。
下面我们通过一个例子来说明这个问题。
create
procedure
Test(
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
-----------------------------------------------------
TEMPORARY TABLE & CURSOR declaration
-----------------------------------------------------
DECLARE
GLOBAL
TEMPORARY
TABLE
SESSION.TEMP
(
ID
INTEGER
,
NAME
CHAR
(30)
)
--WITH REPLACE
NOT
LOGGED;
INSERT
INTO
SESSION.TEMP
VALUES
(1,
'zhangsan'
);
BEGIN
DECLARE
R_CRSR
CURSOR
WITH
RETURN TO CLIENT
FOR
SELECT
*
FROM
SESSION.TEMP
FOR
READ ONLY;
OPEN R_CRSR;
END
;
END
@
运行后得到的结果
:
call Test()
completed successfully.
结果集
1
--------------
ID
NAME
----------- ------------------------------
1 zhangsan
1
条记录已选择。
返回状态
= 0
Statement processed successfully in 0.29 secs.
可以看到是我们想要的结果,但是如果再次运行这个存储过程会怎样呢
.
再次
call Test()
后报错
,
可以看到报的是已经有
SESSION.TEMP
的错误。
为什么第一次正确第二次执行的时候程序却出错了,这是因为在同一个连接中,临时表并没有被
DROP
掉,所以在第二次调用存储过程的时候就会出现临时表已经存在的错误。
另外一种情况,就是很多时候例如在
websphere
中通过
JDBC
连接数据库时使用了连接池的技术,这带来了一些效率的提升,同时在某些情况下也容易让人误解。客户应用程序中关闭了数据库连接,但是并不一定真正关闭了数据库连接,如果客户应用程序使用了临时表而数据库连接并没有关闭,那么临时表就不会被
DROP
。当连接池把这个连接分给另一个客户程序的时候,新的客户程序仍然可以使用旧的临时表,这不是我们希望的。如果想避免上述问题,可以在创建临时表时,加上
WITH REPLACE
;或者根据业务逻辑在合适的地方显示的
DROP
临时表。
下面是使用
WITH REPLACE
创建临时表的执行情况。
create
procedure
Test(
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
-----------------------------------------------------
TEMPORARY TABLE & CURSOR declaration
-----------------------------------------------------
DECLARE
GLOBAL
TEMPORARY
TABLE
SESSION.TEMP
(
ID
INTEGER
,
NAME
CHAR
(30)
)
WITH
REPLACE
NOT
LOGGED;
INSERT
INTO
SESSION.TEMP
VALUES
(1,
'zhangsan'
);
BEGIN
DECLARE
R_CRSR
CURSOR
WITH
RETURN TO CLIENT
FOR
SELECT
*
FROM
SESSION.TEMP
FOR
READ ONLY;
OPEN R_CRSR;
END
;
END
@
运行结果为
:
call test()
completed successfully.
结果集
1
--------------
ID
NAME
----------- ------------------------------
1 zhangsan
1
条记录已选择。
返回状态
= 0
再次运行
call test()
,这次并没有报错,反正和第一次一样的结果。可以看出使用
WITH REPLACE
之后在一个连接里面,多次调用存储过程的临时表,也不会出现问题。
临时表在某些情况下也是需要避免使用的。大家知道临时表是存放在内存中的,如果一个临时表有上万或者十几万条记录,同时程序的并发数很大,那么在内存中建立的临时表耗费的资源就很庞大,此时数据库的性能会急剧下降,甚至会导致数据库崩溃。因此,大家在使用临时表的时候,需要考虑它对资源的耗费,避免盲目使用临时表。
分享到:
相关推荐
MySQL临时表是一种在会话范围内创建的特殊类型的表,它仅对当前会话可见,并在会话结束时自动删除。这种技术在处理复杂查询、中间数据处理或报表生成时非常有用,因为它允许用户将查询结果暂存起来,以便进一步处理...
临时表本质上是一种cache的表现形式,Oracle的临时表都是事先建好的,一旦用了临时表,存放的是和本会话相关的数据,没有人会傻乎乎地用临时表来保存本应该共享的数据。 with子查询实际上也是用了临时表,...
主流数据库中临时表的使用 在主流数据库中,临时表是一种特殊类型的表,它们是临时存储数据的容器。临时表可以在不同的数据库管理系统中使用,本文将对 MS SQLSERVER、Oracle 和 DB2 中的临时表进行介绍。 MS SQL ...
本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...
### Oracle 临时表用法详解 #### 一、背景与问题描述 在处理数据库操作时,经常遇到因数据量庞大而导致处理效率降低的问题。例如,某个报表中心的存储过程执行速度过慢,其中一个原因是该过程涉及到一个中间表,...
SQL Server 中的临时表概念、创建和插入数据等问题 SQL Server 中的临时表概念是指名称以井号 (#) 开头的表,如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表有两种类型:本地临时表和...
解决 Oracle 临时表空间满的问题需要通过查看当前数据库的默认临时表空间、查看当前临时表空间的大小、创建新的临时表空间、将新建的临时表空间设置为数据库的默认临时表空间、删除原来的临时表空间、创建新的临时表...
Oracle中的临时表是一种特殊的数据结构,用于存储会话或事务期间的数据,这些数据仅对当前会话可见,并在特定条件下自动清除。Oracle提供两种类型的临时表:事务型和会话型。 事务型临时表在事务开始时创建,插入的...
SQL Server 触发器中自动生成的临时表 SQL Server 触发器是一种强大的工具,用于自动执行某些操作,以响应数据库中的变化。其中,系统自动生成的临时表是触发器中一个重要的组成部分。今天,我们将详细介绍 SQL ...
SQL Server 中判断表或临时表是否存在 在 SQL Server 中判断表或临时表是否存在是非常重要的操作,以下将详细介绍如何判断表或临时表是否存在。 判断数据表是否存在 判断数据表是否存在可以使用两种方法。 方法...
这里我们使用Mybatis的注解来定义SQL语句,`@Insert`用于创建临时表,`@Select`用于查询临时表中的数据。注意,临时表在会话结束时会被自动删除,所以它们只对当前连接可见。 接着,我们需要创建一个对应的实体类`...
Oracle 临时表空间不足和批处理缓慢问题探讨 本文探讨了 Oracle 临时表空间不足和批处理缓慢问题的原因和解决方法。通过分析和测试,发现了问题的根源在于应用逻辑方面,具体来说是 SQL 语句的编写问题。通过编写...
### 数据库临时表详解 #### 一、临时表的概念与作用 在数据库操作过程中,我们经常会遇到需要存储一些中间结果或临时数据的情况。这时候,**临时表**就发挥了其独特的作用。临时表,正如其名,是根据需求临时创建...
### Oracle 临时表空间管理与释放脚本解析 在Oracle数据库管理中,临时表空间(Temporary Tablespace)的管理是一项非常重要的任务。合理的管理和优化临时表空间不仅可以提高系统的性能,还可以帮助解决空间不足等...
### SQL Server 临时表详解与示例 #### 一、临时表的概念与分类 临时表是一种特殊的表,用于存储在单个查询或一系列查询中使用的数据,并且在不再需要时可以轻松地删除这些数据。根据其作用范围的不同,临时表分为...
在Oracle数据库系统中,表空间(Tablespace)是存储数据对象(如表、索引、视图等)的逻辑单位,而临时表空间(Temporary Tablespace)则用于存储临时数据,比如排序或联接操作产生的中间结果。创建和管理表空间及...
SQL临时表是数据库操作中的一种实用工具,它们用于在处理大量数据或进行复杂查询时提供暂时的数据存储空间。临时表分为两种类型:本地临时表和全局临时表。 1. **本地临时表**:本地临时表的名称以单个井字号 (#) ...
"Oracle 临时表(事务级、会话级)" Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存一个会话或事务中的数据。当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在...
Oracle数据库中的临时表是一种特殊的表类型,主要用于存储在特定会话或事务期间产生的临时数据。与常规的永久表相比,临时表的数据不会永久保存,而是会在会话结束或事务完成时自动清除,无需用户手动删除。 1. **...
### MySQL临时表与派生表详解 #### 一、MySQL临时表 **1.1 临时表概述** MySQL中的临时表是一种特殊的表类型,主要用于存储临时数据或中间结果集,适用于那些需要多次查询同一结果集的场景。根据存储位置的不同,...