《Oracle编程艺术》学习笔记(29)-临时表和CBO
来源:互联网 发布:依可爱淘宝店 编辑:程序博客网 时间:2024/05/19 13:19
临时表从当前登录用户的临时表空间分配存储空间,每个用户可能在不同的表空间为其临时表分配空间。如果从一个定义者权限(definer right)过程访问临时表,就会使用该过程所有者的临时表空间。全局临时表实际上是表本身的一个模板。
创建临时表的动作不涉及存储空间分配,不会分配初始区段,这与常规表有所不同。一个会话第一次在临时表中放入数据时,才会为该会话创建一个临时段。
不要在运行时在存储过程中创建表。DDL是一种代价昂贵的操作:你要全力避免在运行时执行这种操作。一个应用的临时表应该在应用安装期间创建,绝对不要在运行时创建。
临时表不支持永久表的某些特性:
· 不能有引用完整性约束。临时表不能作为外键的目标,也不能在临时表中定义外键。
· 不能有NESTED TABLE类型的列。在Oracle 9i及以前版本中,VARRAY类型的列也不允许。
· 不能是IOT。
· 不能在任何类型的聚簇中。
· 不能分区。
· 不能通过ANALYZE 表命令生成统计信息。
临时表和CBO
CBO->http://blog.csdn.net/tianlesoftware/article/details/5824886
动态采样->http://blog.csdn.net/tianlesoftware/article/details/5845028
统计信息->http://blog.csdn.net/tianlesoftware/article/details/4668723
在临时表上也是会执行动态采样的,但是动态采样在查询解析时完成,所以存在相当大的代价。
可以使用DBMS_STATS提前收集统计信息。
1)可以使用GATHER_SCHEMA_STATS或GATHER_DATABASE_STATS调用来使用DBMS_STATS。传入参数GATHER_TEMP为TRUE(默认为FALSE)。
但是要保证在收集统计信息的会话中用代表性数据填充全局临时表。
此外,这个方法只对ON COMMIT PRESERVE ROWS全局临时表收集和存储统计信息。对于ON COMMIT DELETE ROWS全局临时表收集不到正确的统计信息。因为调用DBMS_STATS将导致提交,而这会擦除ON COMMIT DELETE ROWS表中的所有信息。可以通过如下测试证明。
tony@ORA11GR2> create global temporary table gtt_preserve (x number) on commit preserve rows;Table created.tony@ORA11GR2> create global temporary table gtt_delete (x number) on commit delete rows;Table created.tony@ORA11GR2> insert into gtt_preserve select user_id from all_users;32 rows created.tony@ORA11GR2> insert into gtt_delete select user_id from all_users;32 rows created.tony@ORA11GR2> exec dbms_stats.gather_schema_stats(user, gather_temp=>true);PL/SQL procedure successfully completed.tony@ORA11GR2> select table_name, num_rows,avg_row_len,blocks,last_analyzed from user_tables;TABLE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS LAST_ANALYZE---------------------------------------- ---------- ----------- ---------- ------------EMP 14 38 5 17-OCT-11DEPT 4 20 5 17-OCT-11GTT_DELETE 0 0 0 17-OCT-11GTT_PRESERVE 32 3 1 17-OCT-11tony@ORA11GR2> rollback;Rollback complete.tony@ORA11GR2> select count(*) from gtt_preserve; COUNT(*)---------- 32
可以看到GTT_DELETE表的统计信息中,行数为0。
2)可以直接在表上使用GATHER_TABLE_STATS。
对于ON COMMIT DELETE ROWS全局临时表,还是存在同样的问题。
3)可以手动填充临时表的统计信息。例如,
begindbms_stats.set_table_stats( ownname => USER, tabname => 'GTT_DELETE', numrows => 32, numblks => 1, avgrlen => 3);end;/
- 《Oracle编程艺术》学习笔记(29)-临时表和CBO
- 《Oracle编程艺术》学习笔记(18)-REDO和UNDO
- 《Oracle编程艺术》学习笔记(18)-REDO和UNDO
- ORACLE学习笔记(一) -- RBO 和 CBO
- 《Oracle编程艺术》学习笔记(24)-堆组织表和表压缩
- 《Oracle编程艺术》学习笔记(22)-表类型
- 《Oracle编程艺术》学习笔记(25)-索引组织表
- 《Oracle编程艺术》学习笔记(38)-表分区
- 《Oracle编程艺术》学习笔记(23)-段
- 《Oracle编程艺术》学习笔记(27)-散列聚簇表
- 《Oracle编程艺术》学习笔记(9)-Oracle中的文件-数据文件和存储体系(表空间/段/区段/块)
- 《Oracle编程艺术》学习笔记(5)-Oracle中的文件
- 《Oracle编程艺术》学习笔记(11)-Oracle进程
- 《Oracle编程艺术》学习笔记(12)-Oracle的锁
- 学习《Oracle 9i10g编程艺术》的笔记 (十二) redo 和undo 如何协作
- 《Oracle编程艺术》学习笔记(10)-SGA,PGA,UGA和memory_target
- 《Oracle编程艺术》学习笔记(34)-数据类型-字符串和二进制串
- 学习《Oracle 9i10g编程艺术》的笔记 (一)
- 机器学习 2
- 类和结构体的区别
- 10-24
- Comparison of Performance of Different poll implementations
- [OLEDB]OLEDB对于不同版本Excel的连接字符串
- 《Oracle编程艺术》学习笔记(29)-临时表和CBO
- _IO, _IOR, _IOW, _IOWR 宏的用法与解析
- 《乔布斯传》最后一章精华节选
- PHP编程效率53个提高方法
- 简单的servlet程序的编写
- DBA常用的表
- 装配线调度(算法导论)
- 下拉列表<Select>回调用Javascript代码备忘
- 【网络中心】解题报告