Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          Oracle臨時表
          ?
          ??? Oracle臨時表只需要創建一次,其結構總是有效的,每次使用后被清空的只是表里的數據。
          ?
          ??? Oracle的臨時表還保證了 多用戶操作的獨立性:對于使用同一張臨時表的不同用戶,ORACLE都會分配一個獨立的Temp Segment,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而保證了多個用戶操作的并發性和獨立性;
          ??? Oracle臨時表分為兩種,如下:
          ?

          ??? create global temporary table t66 (

          ??? ? ID number ,

          ??? ? NAME varchar2 ( 20 ),

          ??? ? OP_DATE date )

          ??? on commit delete rows ;--數據提交時清空表

          ?

          ??? create global temporary table t66 (

          ??? ? ID number ,

          ??? ? NAME varchar2 ( 20 ),

          ??? ? OP_DATE date )

          ??? on commit preserve rows ;--會話結束時清空表

          ?
          ?
          臨時表的存儲空間
          ?

          ??? select owner,table_name,tablespace_name from dba_tables where table_name= 'T66';

          ?
          ??? 由上面的查詢發現,創建的臨時表T66不在默認的表空間中儲存
          ?
          ??? SQL> alter tablespace temp offline;?????
          ?
          ??? 表空間已更改。
          ?
          ??? SQL> insert into t66
          ?????? 2 select * from t1;
          ?
          ??? insert into t66
          ??????????????? *
          ?
          ??? ERROR 位于第 1 行:
          ??? ORA-01542: 表空間'TEMP'脫機,無法在其中分配空間
          ?
          ??? 由上面的操作發現,表T66存儲于TEMP表空間中
          ?
          ?
          臨時表應用舉例
          ?
          ??? 1、臨時表不建立索引,所以如果數據量比較大或進行多次查詢時,不推薦使用
          ?
          ??? 2、數據處理比較復雜的時候使用臨時表快,反之視圖快點
          ?
          ??? 3、在僅僅查詢數據的時候建議用游標
          ?
          ??? 4、在分析數據時,經常用到臨時表來存放中間數據
          ?
          ??? 舉例: 對于一個電子商務類網站,不同消費者在網站上購物,就是一個獨立的SESSION,選購商品放進購物車中,最后將購物車中的商品進行結算。也就是說,必須在整個SESSION期間保存購物車中的信息。同時,還存在有些消費者,往往最終結賬時放棄購買商品。如果,直接將消費者選購信息存放在最終表(PERMANENT)中,必然對最終表造成非常大的壓力。
          ??? 因此,對于這種案例就可以采用創建臨時表 (ON COMMIT PRESERVE ROWS) 的方法來解決。數據只在 SESSION 期間有效,對于結算成功的有效數據,轉移到最終表中后,ORACLE自動TRUNCATE 臨時數據;對于放棄結算的數據,ORACLE 同樣自動進行 TRUNCATE ,而無須編碼控制,并且最終表只處理有效訂單,減輕了頻繁的DML的壓力。
          ?
          ?
          臨時表使用索引問題
          ?
          ??? 總體來說,在臨時表上建立索引經常會被忽略不使用,所以盡量還是不要加索引,太大的數據量就不要用臨時表了。
          ?
          ??? 具體的索引使用情況參見文章 http://bbs.bitscn.com/69514
          ?
          ?
          ?
          posted on 2008-10-15 20:01 decode360 閱讀(149) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 勐海县| 广东省| 厦门市| 府谷县| 临高县| 龙江县| 黄骅市| 阳新县| 沽源县| 枣阳市| 达拉特旗| 康乐县| 科技| 汽车| 额济纳旗| 宜兴市| 赤水市| 海阳市| 临夏市| 祥云县| 湟源县| 新龙县| 永州市| 峡江县| 许昌市| 铜山县| 卓尼县| 鹤山市| 方山县| 白朗县| 济阳县| 崇信县| 金川县| 行唐县| 万盛区| 辽中县| 余江县| 巫山县| 奎屯市| 沙湾县| 绍兴市|