`
iihero
  • 浏览: 249658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

各种数据库临时表的使用区别总结

阅读更多
[size=large]虽然SQL92, 99, 2003, 2008标准都有推出,但并不是所有商家严格按照标准行事。痛苦的是使用和应用不同数据库的DBA和开发人员。
这里以几种主流数据库为例,分别介绍一下临时表的使用:

1. PostgreSQL (以9.x为例)

使用的是比较标准的语法:
create [global | local] temp table t ( id int primary key) on commit delete | preserve rows
其中,global和local是摆设,一样的效果。都是会话级别的。当前会话退出,表即删除。
可以创建与当前模式相同的表名,即可以创建同名的表t,drop table t时,会先删除临时表。如下例所示:

iihero=# create global temp table t(id int primary key) on commit delete rows;  
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t_pkey" for table "t"  
CREATE TABLE  
iihero=# insert into t values(1);  
INSERT 0 1

iihero=# select * from t;  
 id  
----  
(0 rows)  
</span>  

iihero=# begin;  
BEGIN  
iihero=# insert into t values(1);  
INSERT 0 1  
iihero=# select * from t;  
 id  
----  
  1  
(1 row)  
  
iihero=# commit;  
COMMIT  
iihero=# select * from t;  
 id  
----  
(0 rows)  
</span>  


2. DB2 9.x
1). DB2的临时表需要用命令Declare Temporary Table来创建, 并且需要创建在用户临时表空间上;
2). DB2在数据库创建时, 缺省并不创建用户临时表空间, 如果需要使用临时表, 则需要用户在创建临时表之前创建用户临时表空间;
3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现 .;
4). 缺省情况下, 在Commit命令执行时, DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;
5). 运行ROLLBACK命令时, 用户临时表将被删除;
下面是DB2临时表定义的一个示例:
DECLARE GLOBAL TEMPORARY TABLE results
    (  
        RECID     VARCHAR(32)     ,    --id
        XXLY      VARCHAR(100),        --信息来源
        LXDH      VARCHAR(32 ),        --信息来源联系电话
        FKRQ      DATE           --反馈时间
    ) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;



3. MySQL 5.X

基本上就是会话级的,与PG类似,但没有PG语法完整。

建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)
临时表将在你连接MySQL期间存在。当你断开时,MySQL将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。
DROP TABLE tmp_table
如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,临时表将有必要屏蔽(隐藏)非临时表tmp_table。
如果你声明临时表是一个HEAP表,MySQL也允许你指定在内存中创建它:
 CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
) TYPE = HEAP
因为HEAP表存储在内存中,你对它运行的查询可能比磁盘上的临时表快些。然而,HEAP表与一般的表有些不同,且有自身的限制。

4. Sybase ASE15.X

基本上就是比较裸露的语法了:
create table tempdb..t(id int primary key), 这个等价于global temp table t, server级的, 各连接都可以访问,需要显式的drop
create table #t(id int primary key), 这个等价于local temp table t,  会话级的,连接断开时会自动删除

5. MS SQL Server 200X
与Sybase类似,但多出一个变种
create table ##t(id int primary key), 这个等价于global temp table t, server级的, 各连接都可以访问,需要显式的drop
create table #t(id int primary key), 这个等价于local temp table t,  会话级的,连接断开时会自动删除

最后,Sybase ASE以及MS SQL Server使用中,需要注意会话的自动产生及断开
比如一个变量:

declare @vsql varchar(4096)
set @vsql="select * into #t123 from emp"
execute (@vsql)
set @vsql="select top 3 * from #t123"
execute (@vsql)
当你执行这个段时,你会发现,最后提示#t123不存在,因为execute在执行完时,会话即退出。要想执行成功,有两种方法:
1. 将两个sql合成一段来执行 : set @vsql = @vsql || "  select top 3 * from #t123"
2. 使用global temp table, 即tempdb..t123或者SQLServer中的##t123

临时表,在ASE, SQLServer中使用频率非常高,经常出现在存储过程当中。

6. Oracle9.x and later
语法与PG一样,还提供on commit preserve rows, 和on commit delete rows功能。
但是只提供global功能,意即表本身不会自动删除。 只是提供是否保留数据的功能。这样,preserve rows相当于会话级,而on commit delete rows则相当于事务级的临时表了。用处还是蛮大的。
缺点还有:
1)不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
2)不支持主外键关系

总之,临时表的实现和使用,还真没有一个十全十美的商家。多留心一点就是了。[/size]
0
1
分享到:
评论

相关推荐

    计算机等考三级数据库基础:临时表和游标的使用小总结.docx

    计算机等考三级数据库基础:临时表和游标的使用小总结.docx

    MYSQL 临时表用法总结

    MYSQL 临时表用法总结 1.背景 老项目最近被吐槽性能不行,经排查发现mysql占用cpu...如果在你创建名为test_table_20200313临时表时名为test_table_20200313的表在数据库中已经存在,临时表将隐藏非临时表test_table_202

    Oracle Database12c数据库100个新特性与案例总结V2.0

    目 录 1 Oracle 12cR1数据库新特性 6 ...1.3 表分区或子分区的在线迁移 12 1.4 不可见字段 12 1.5 相同字段上的多重索引 13 1.6 DDL日志 13 1.7 临时undo 13 ···················

    MySQL操作数据库和表的常用命令新手教程

    学习如何管理和导航MySQL数据库和表是要掌握的首要任务之一,下面的内容将主要对MySQL的数据库和表的一些常用命令进行总结,一些我们不得不掌握的命令,一些信手拈来的命令。 处理数据库 1.查看数据库 获取服务器上...

    数据库报告

    数据库的单表查询和连接查询,数据库的简单查询和连接...该实验包括投影、选择条件表达式、数据排序、使用临时表等。 2、连接查询操作 该实验包括等值连接、自然连接、求笛卡儿积、一般连接、外连接、内连接、左连接、

    MySQL内部临时表策略

    通过对MySQL数据库源码的跟踪和调试,以及参考MySQL官方文档,对MySQL内部临时表使用策略进行整理,以便于更加深入的理解。  使用内部临时表条件  MySQL内部临时表的使用有一定的策略,从源码中关于SQL查询...

    数据库系统概论第四版答案

    中的临时数据存储一般使用文件比较合适。早期功能比较简单、比较固定的应用系统也适合 用文件系统。 ( 2 )适用于数据库系统而非文件系统的应用例子目前,几乎所有企业或部门的信息系统 都以数据库系统为基础,都...

    什么是NoSQL数据库?

    面向文档的数据库具有以下特征:即使不定义表结构,也可以像定义了表结构一样使用。关系型数据库在变更表结构时比较费事,而且为了保持一致性还需修改程序。然而NoSQL数据库则可省去这些麻烦(通常程序都是正确的)...

    数据库索引总结.xmind

    为什么要使用索引? 通过创建唯一性索引,可以保证数据库 表中每一行数据的唯一性。... 帮助服务器避免排序和临时表 将随机IO变为顺序IO 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

    MySQL常用命令 MySQL处理数据库和表的命令

    学习如何管理和导航MySQL数据库和表是要掌握的首要任务之一,下面的内容将主要对MySQL的数据库和表的一些常用命令进行总结,一些我们不得不掌握的命令,一些信手拈来的命令。 一、处理数据库 1、查看数据库 获取...

    删除数据库表中重复数据的总结(oracle)

     大体可以分为两个方法 :一种要用rowid来进行删除,另外一种,则是用临时表来进行删除。这里讲四种方法:  现在假设 表test中有,三个列col1,col2,col3;在这样的表里有很多数据是重复的,现在的目标是对这些...

    优化mysql数据库的经验总结

    1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小...

    MySQL存储过程完整版使用代码示例

    资源包中囊括了MySQL数据库中的存储过程的使用包含的基本结构及日常所使用到的基本函数的使用【包括java端调用存储过程,创建临时表,动态执行sql语句,过程的递归调用,指针循环取数,批量创建表删除表,树状结构的...

    mysql数据库my.cnf配置文件

    所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。 # 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。 # 如果某个内部...

    详解MySQL数据库优化的八种方式(经典必看)

    引言:  关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些... 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,

    Oracle 数据库优化实战心得总结

    优化sql语句 1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。 2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中...

    Teradata基础知识(绝对中文)

    7.4 临时流水(TRANSIENT JOURNAL) 74 7.5 永久流水(PERMANENT JOURNAL) 74 7.6 FALLBACK保护 75 第八章 客户端访问TERADATA数据库的方法 77 8.1 概述 77 8.2 TERADATA数据库的编程接口 78 8.2.1 调用层接口CLI 78 ...

    第二热电厂MIS系统数据库设计论文

    4.4.2 临时表空间 ERMISTEMP 105 4.4.3 索引表空间ERMISIDX 106 4.5 回退段SQL规程 106 4.6 数据库用户实体创建SQL规程 107 4.7 数据库例程创建SQL规程 107 4.8 数据库角色 107 4.9 角色创建SQL规程 107 4.10 角色...

Global site tag (gtag.js) - Google Analytics