您的位置:首页 > 其它

临时表

2013-12-02 17:59 183 查看
临时表是会话/事务中的中间集合,它保存的数据只对本次会话/事务可见。即使提交其他会话都无法查看。

不存在多用户并发问题,不存在一个会话阻塞另一个会话问题,即使锁住也不会有影响其他会话使用。

临时表增删改不会产生redo,但是它会产生undo,undo会产生redo日志,所以他不会直接产生日志,会间接产生redo。delete和update产生的undo比较多。

临时表空间分配:临时表会在当前用户默认临时表空间中分配存储空间或者可能使用一个过程定义者的临时表空间(如果从一个定义权限权限过程访问临时表)。全局临时表就是一个模板,创建时不需要指定任何存储空间和段属性。临时表相关的属性直接存储在数据字典中,临时表定义是静态定义。

创建会话级别临时表

create global temporary table temp_t

on commit preserve rows

as

select * from all_objects where 1=0;

创建事务级别临时表

create global temporary table temp_t1

on commit delete rows

 as

select * from all_objects where 1=0;

代码中动态创建临时表出现问题:

1、DDL代价非常大,包括大量递归SQL语句,DDL涉及到大量串行化

2、动态创建会失去静态SQL优势。

3、同时执行存储过程两个副本,导致两个存储过程中删除和新增冲突

4、会导致表无法删除:因为断电等原因导致,需要手动删除。

临时表支持:触发器、检查约束、索引

不支持:引用约束、不能表嵌套、IOT、

临时表使用优化器是RBO规则优化器

可以精心设计让临时表使用CBO优化器,通过DBMS_stats、dynamic_sampling(tablename 2)

select /* +first_rows  dynamic_sampling( t 2)*/  t.* from temp_t1  t; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  临时表