Oracle中的临时表Temporary Table

打印 上一主题 下一主题

主题 854|帖子 854|积分 2562

Oracle中的临时表(Temporary Table)是一种特别范例的表,用于存储临时数据,这些数据在会话结束或事务提交后会自动删除。Oracle数据库提供了两种主要的临时表范例:事务级全局临时表和会话级全局临时表。
全局临时表(Global Temporary Table)

全局临时表是Oracle数据库中常用的临时表范例,它具有以下特点:

  • 临时性:全局临时表中的数据在会话结束或事务提交后(取决于ON COMMIT子句的设置)自动删除。
  • 私有性:尽管名为“全局”,但全局临时表中的数据对于创建它的会话是私有的,其他会话无法访问。
  • 性能上风:全局临时表使用内存或临时表空间存储数据,相比于在磁盘上进行操作,速率更快,可以进步查询性能,并淘汰数据库资源的占用。
  • 淘汰锁等待时间:由于全局临时表的数据只在当前会话中存在,不会被其他会话访问,因此淘汰了锁等待时间,进步了并发访问性能。
创建全局临时表的语法:

  1. CREATE GLOBAL TEMPORARY TABLE table_name (
  2.     column1 datatype [constraint],
  3.     column2 datatype [constraint],
  4.     ...
  5.     columnN datatype [constraint]
  6. ) ON COMMIT { DELETE ROWS | PRESERVE ROWS };
复制代码


  • table_name:临时表的名称。
  • column1, column2, ..., columnN:表的列名。
  • datatype:列的数据范例。
  • constraint:可选的约束条件。
  • ON COMMIT { DELETE ROWS | PRESERVE ROWS }:指定在事务提交时如何处置惩罚临时表中的数据(事务级/会话级)。
  • DELETE ROWS 是临时表的默认参数,体现在事务提交后删除数据,临时表中的数据仅在事物过程(Transaction)中有用,当事物提交(COMMIT)后,临时表的临时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
  • PRESERVE ROWS 它体现临时表的内容可以跨事物而存在,不外,当该会话结束时,临时表的临时段将随着会话的结束而被抛弃,临时表中的数据自然也就随之抛弃,但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。。
会话/事务临时表(概念上的理解)

固然Oracle官方术语中并不直接称为“会话临时表”,但全局临时表在会话级别的举动可以被视为会话临时表的一种实现。即,全局临时表在会话结束时(如果ON COMMIT设置为PRESERVE ROWS且会话正常结束)或事务提交后(如果ON COMMIT设置为DELETE ROWS)自动删除数据,从而实现了数据的会话级临时性。
示例

  1. -- 全局临时表 使用on commit delete rows选项(事务级临时表,事务提交,数据删除,保留临时比表结构)
  2. HR@orcl> create global temporary table t_temp_emp on commit delete rows as select employee_id,last_name,salary from employees;
  3. Table created.
  4. HR@orcl> select * from t_temp_emp;
  5. no rows selected
  6. -- 全局临时表 使用默认选项(事务级临时表,事务提交,数据删除,保留临时比表结构)
  7. HR@orcl> create global temporary table t_temp_emp_1 as select employee_id,last_name,salary from employees;
  8. Table created.
  9. HR@orcl> select * from t_temp_emp_1;
  10. no rows selected
  11. -- 事务级临时表,事务不提交或回滚,则临时表数据不删除
  12. HR@orcl> insert into t_temp_emp select employee_id,last_name,salary from employees;
  13. 107 rows created.
  14. HR@orcl> select * from t_temp_emp;
  15. EMPLOYEE_ID LAST_NAME                     SALARY
  16. ----------- ------------------------- ----------
  17.         100 King                           24000
  18.         101 Kochhar                        17000
  19.         102 De Haan                        17000
  20.         103 Hunold                          9000
  21.         104 Ernst                           6000
  22. .................  省略中间行内容 ................
  23.         205 Higgins                        12008
  24.         206 Gietz                           8300
  25. 107 rows selected.
  26. -- 提交事务,则数据删除
  27. HR@orcl> commit;
  28. Commit complete.
  29. HR@orcl> select * from t_temp_emp;
  30. no rows selected
  31. -- 创建会话级临时表
  32. HR@orcl> create global temporary table t_temp_emp_session on commit preserve rows as select employee_id,last_name,salary from employees;
  33. Table created.
  34. -- 当前会话保留数据
  35. HR@orcl> select * from t_temp_emp_session;
  36. EMPLOYEE_ID LAST_NAME                     SALARY
  37. ----------- ------------------------- ----------
  38.         100 King                           24000
  39.         101 Kochhar                        17000
  40.         102 De Haan                        17000
  41.         103 Hunold                          9000
  42.         104 Ernst                           6000
  43. .................  省略中间行内容 ................
  44.         205 Higgins                        12008
  45.         206 Gietz                           8300
  46. 107 rows selected.
  47. -- 切换会话
  48. HR@orcl> conn / as sysdba
  49. Connected.
  50. -- 再次hr用户登陆
  51. SYS@orcl> conn hr/hr@ORCL
  52. Connected.
  53. -- 发现数据在会话切换(创建临时表的当前会话结束,数据自然也就随之丢弃)
  54. HR@ORCL> select * from t_temp_emp_session;
  55. no rows selected
复制代码




  • 查看临时表空间中段的环境,可以查看v$temp_extent_map
  • 查看临时表空间的文件:v$tempfile;
  • 查看sql使用临时块的环境:v$tempseg_usage
  • 查看临时块的状态v$tempstat
  • 从DBA_TABLES/USER_TABLES视图的DURATION列来查询是 on commit delete rows / on commit presever rows
  1. HR@ORCL> col table_name format a30
  2. HR@ORCL> select table_name,tablespace_name,DECODE(DURATION,'SYS$SESSION','会话级','SYS$TRANSACTION','事务级') T_TYPE from user_tables where temporary='Y';
  3. TABLE_NAME                     TABLESPACE_NAME                T_TYPE
  4. ------------------------------ ------------------------------ ---------
  5. T_TEMP_EMP_1                                                  事务级
  6. T_TEMP_EMP                                                    事务级
  7. T_TEMP_EMP_SESSION                                            会话级
复制代码
应用场景

全局临时表在Oracle数据库中有广泛的应用场景,包括但不限于:


  • 临时存储盘算结果:在实行复杂的查询或盘算时,可以将中央结果存储在全局临时表中,以便后续查询或处置惩罚。
  • 优化性能:通过淘汰磁盘I/O操作和进步内存访问速率,全局临时表可以显著进步查询性能。
  • 会话级数据管理:全局临时表可以用于存储用户特定的参数、上下文信息或临时状态,确保数据的隔离性和独立性。
总之,Oracle中的全局临时表是一种强大的工具,它提供了灵活、高效和安全地处置惩罚临时数据的机制,满足了各种数据库应用场景的需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表