新闻中心> 文章详情

浅谈Oracle临时表用法的比较

2015年07月10日

  Oracle数据库学问很多,作为一个Oracle初学者,对于Oracle临时表用法要知道,临时表是复杂SQL性能优化中常见手段,总结一下。


  1)GlobalTemporary句


  分为会话级和事务级两种。


  会话级的临时表


  【语法】


  CreateGlobalTemporaryTableTable_Name


  (theaggregationSQLstatement)OnCommitPreserveRows;


  【特点】


  临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中。表的定义对所有的会话可见。南京Oracle认证培训


  临时表不需要DML锁。


  可以索引临时表和在临时表基础上建立视图。


  在临时表上的索引也是临时的,也是只对当前会话或者事务有效。


  临时表可以拥有触发器。


  可以用export和import工具导入导出临时表的定义,但是不能导出数据。


  【适用场合】


  当某一个SQL语句多表关联,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。


  程序执行过程中多次使用的临时数据,这些数据在整个程序的会话过程中都需要用的等等。


  【清除时点】


  当某一个SESSION退出之后自动清除数据(表结构保留)


  【不足】


  不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。


  不支持主外键关系。


  例子:


  CREATEGLOBALTEMPORARYTABLEmy_temporary


  (birthdateDATE,


  enddateDATE,


  nameCHAR(20))ONCOMMITPRESERVEROWS;


  事务级的临时表


  【语法】


  CreateGlobalTemporaryTableTable_Name


  (theaggregationSQLstatement)OnCommitDeleteRows;


  【清除时点】当执行COMMIT之后自动清除数据(表结构保留)


  其他方面与会话级的临时表相同,不再列出。


  2)with句


  准确的说with语句不叫临时表,但它与临时表使用概念上非常接近,同样列出。南京Oracle认证培训


  【语法】


  WITH


  subquery_name


  AS


  (theaggregationSQLstatement)


  SELECT


  (querynamingsubquery_name);


  【特点】


  附着于一个SQL语句,也只对一个SQL语句产生作用。


  可以同时生成几张临时表。


  生存期极短,易于管理。


  【适用场合】


  GlobalTemporary的适用场合都适用,只是针对一个SQL的场合,特别方便融入常量或集合运算结果,有简化SQL的作用。南京Oracle认证培训


  【清除时点】


  查询完成后立即清除(数据及表结构)。


  例子:


  WITH


  sum_salesAS


  (select/*+materialize*/


  sum(quantity)all_salesfromstores),


  number_storesAS


  (select/*+materialize*/


  count(*)nbr_storesfromstores),


  sales_by_storeAS


  (select/*+materialize*/


  store_name,sum(quantity)store_salesfrom


  storenaturaljoinsales)


  SELECT


  store_name


  FROM


  store,


  sum_sales,


  number_stores,


  sales_by_store


  where


  store_sales>(all_sales/nbr_stores)


  (注:使用/*+materialize*/让Oracle基于cost-based(基于成本)的优化策略生成临时表。)南京Oracle认证培训


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入