1. 程式人生 > >Oracle的臨時表和統計資訊的處理

Oracle的臨時表和統計資訊的處理

  • 臨時表介紹

Oracle的臨時表分為會話級和事務級,建立語句:

--會話級:

create global temporary table tmp_sess_dept on commit preserve rows as select * from dept ;

--事務級

create global temporary table tmp_tran_dept on commit delete rows as select * from dept

會話級的臨時表,在一個會話期間內,表的資料都會存在。

事務級的臨時表,當事務結束的時候表的資料會自動的刪除。。

臨時表資料存在於排序段,排序段是會話所專有的,每個會話是隔離的,每個會話只能見到自己的資料。

驗證表是否為臨時表,以及臨時表的生命週期:

select table_name,LOGGING,TEMPORARY,DURATION from user_tables;

   TMP_TRAN_DEPT  NO Y  SYS$TRANSACTION

   TMP_SESS_DEPT  NO Y  SYS$SESSION

多個會話同時使用臨時表的時候,會發現有多個排序段在活動。每個會話只是使用臨時表在系統表空間中的定義,所以DROP的時候不會去回收站,而是直接從字典中刪除。

驗證有多少個使用者在使用排序段(檢視許可權SELECT ANY DICTIONARY):

SELECT TABLESPACE_NAME,CURRENT_USERS FROM V$SORT_SEGMENT;

驗證臨時表:

insert into tmp_sess_dept select * from dept;

select * from tmp_sess_dept;

commit;

select * from tmp_sess_dept;

insert into tmp_tran_dept select * from dept;

select * from tmp_tran_dept;

commit;

select * from tmp_tran_dept;

  • 臨時表的統計資訊處理

目的:

臨時表是會話隔離的,收集臨時表的統計資訊是沒有任何用處,還可能造成錯誤的執行計劃。臨時表的統計資訊要刪除,並且鎖定臨時表的統計資訊,或者關閉資料庫的自動收集統計資訊任務,改成手動去收集。

資料庫優化器模式

檢視資料庫的優化器模式:

SQL> show parameter mode

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

optimizer_mode                       string      ALL_ROWS

remote_dependencies_mode             string      TIMESTAMP

result_cache_mode                    string      MANUAL

修改資料庫的優化器選擇模式:

alter system set optimizer_mode='CHOOSE' scope=both;

測試1:不同的session收集統計資訊

建立一個session,對臨時表插入資料;

新建一個session,收集臨時表統計資訊:

begin

  dbms_stats.gather_table_stats('SCOTT', 'TMP_SESS_DEPT');

end;

begin

  dbms_stats.gather_table_stats('SCOTT', 'TMP_TRAN_DEPT');

end;

檢視臨時表的統計資訊:

select * from dba_tab_statistics a

 where a.TABLE_NAME in ('TMP_SESS_DEPT','TMP_TRAN_DEPT');

結構顯示統計項為0,因為臨時表是會話隔離的,所以統計資訊為0.

測試2:在一個session內收集統計資訊

建立一個session,對臨時表插入資料;

收集統計資訊

begin

  dbms_stats.gather_table_stats('SCOTT', 'TMP_SESS_DEPT');

  dbms_stats.gather_table_stats('SCOTT', 'TMP_TRAN_DEPT');

end;

/

檢視統計資訊:

select *

  from dba_tab_statistics a

 where a.TABLE_NAME in ('TMP_SESS_DEPT', 'TMP_TRAN_DEPT');

查詢結果顯示會話級的臨時表有相應的統計資訊,事務級的臨時表統計資訊顯示的行數為0,這是因為在收集統計資訊的時候進行了事務的提交。

測試3:演示錯誤執行計劃

用事務級的臨時表進行測試,在3張表的關聯,測試語句如下:

select *

  from emp e, SALGRADE s, tmp_tran_dept d

 where e.sal between s.losal and s.hisal

   and e.deptno = d.deptno

檢視產生的執行計劃:

select a.SQL_TEXT,a.SQL_ID,a.CHILD_NUMBER from v$sql a where a.SQL_TEXT like &stat

select * from table(dbms_xplan.display_cursor(&sqlid,0));

在一個事務裡使用事務級的臨時表,執行計劃顯示產生了笛卡爾連線。

正常的執行計劃為:

為了避免資料庫引用錯誤的臨時表統計資訊:

  1. 建議:

begin

  dbms_stats.delete_table_stats('SCOTT', 'TMP_TRAN_DEPT');

end;

/

begin

  dbms_stats.lock_table_stats('SCOTT', 'TMP_TRAN_DEPT');

end;

/

相關推薦

Oracle臨時統計資訊處理

臨時表介紹 Oracle的臨時表分為會話級和事務級,建立語句: --會話級: create global temporary table tmp_sess_dept on commit preserve rows as select * from dept ; --

遙感影象處理 | 採用GDAL讀取影象成功後獲取影象的一些基本資訊統計資訊(C#)

描述資訊:  const char*  GDALDataset.GetDriver().GetDescription(),通常是影象的格式 影象大小:  影象寬度  int  GDALDataset.GetRasterXSize() &nbs

oracle臨時空間過大的原因&&處理

oracle臨時表空間過大的原因 2009-05-12 11:22 Oracle臨時表空間主要是用來做查詢和存放一些快取的資料的,磁碟消耗的一個主要原因是需要對查詢的結果進行排序,如果沒有猜錯的話,在磁碟空間的(記憶體)的分配上,Oracle使用的是貪心演算法,如果上次磁碟空間消耗達到1GB,那麼臨時表空

MSSQL 臨時公用使用案例

pan -s span cnblogs div count state insert pda 1、臨時表: 1.1)實例1 if(OBJECT_ID(‘tempdb..#a‘) IS NOT NULL) drop table #a; if(OBJECT_ID(‘t

ORACLE臨時空間總結

datafile 資源 indicate height 完成 round clip blocks rip 臨時表空間概念 臨時表空間用來管理數據庫排序操作以及用於存儲臨時表、中間排序結果等臨時對象,當ORACLE裏需要用到SORT的時候,並且當PGA中sort_ar

oracle字段添加註釋

oracle 註釋 備註comment on column TableName.ColumnName is ‘備註名’;comment on table TableName is ‘備註名‘;oracle 給表和字段添加註釋

oracle 臨時空間 占用磁盤空間

oracle 臨時表空間新創建一個臨時表空間 tmpacreate temporary tablespace TEMPA TEMPFILE ‘/oracle/tmp/tempa01.dbf ‘ SIZE 8192M REUSE AUTOEXTEND ON NEXT

ORA-1652:臨時空間異常優化處理

ora-1652 temp is-not-null 優化 1、查看 alert_PROD.log 【錯誤信息】:ORA-1652: unable to extend temp segment by 128 in tablespace TEMP1 查看臨時表空間基礎信息及其使用情況:基礎信

Oracle臨時空間使用分析

臨時表空間查詢臨時表空間的使用情況: select * from (select a.tablespace_name,sum(maxbytes/1024/1024/1024) total_G,sum(a.bytes/1024/1024) allocated_mbfrom dba_temp_files awhe

ORACLE分組查詢統計

多層分組 != pre java代碼 from pex int base lec select flow_id,rw from (select t.flow_id ,rownum as rw from apex_030200.wwv_flow_list_templates

oracle 臨時空間使用情況

HA 空間占用 limited 空間使用 ase hash join sel ted 不足 今天用戶那邊執行一個很簡單的SQL,輸出結果集也才幾萬條,涉及三表,最大也才100萬數據量,結果卻報了表空間不足的情況,理論來說,這樣的SQL怎麽也不應該吃這麽多臨時表空間。 查詢臨

解決Oracle臨時空間佔滿的問題

正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作後,Oracle是會自動釋放掉臨時段的。但有些有侯我們則會遇到臨時段沒有被釋放,TEMP表空間幾乎滿的狀況,甚至是我們重啟了資料庫仍沒有解決問題。這個問題在論壇中也常被網友問到,下面我總結一下,給出幾

Oracle 一些空間問題的處理

一,SYSAUX 表空間不足 SYSAUX 表空間做為 SYSTEM 表空間的輔助表空間,主要存放 EM 相關的內容以及表統計資訊,AWR快照,審計資訊等,而如果 SYSAUX 表空間在預設條件下你如果不做任何配置,隨著時間的推移,會膨脹的越來越大。 1、是什麼佔用了 sysaux 空間 select

臨時空間日常維護處理

Oracle臨時表空間主要用來做查詢和存放一些緩衝區資料。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序 監控臨時表空間: COL TEMP_FILE FOR A60; SELECT ROUND((F.BYTES_FREE + F.BYTES_USED)/1024/1024/1024, 2) AS "

ORACLE 臨時空間管理

 臨時表空間和臨時段   臨時表空間用於存放排序、臨時表等資料,其資訊不需要REDO,因此臨時表的DML操作往往比普通表產生的REDO少很多。臨時表資料變化不產生REDO,UNDO資料變化產生REDO。臨時段不僅僅存在於臨時表空間中,也可能存在普通表空間。比如通過CTAS建立一張表,新表的資料放在

oracle 臨時效能下降

oracle生產環境上有個儲存過程執行一段時間之後效能下降。初步定位後發現是臨時表的插入效能降低: insert into  臨時表A (...) select ... from ... .      其中select .. from ...的速度很快

呼叫儲存過程一次後,程式崩潰 (臨時變數)

編寫了一個顯示資料的儲存過程,前臺視窗首次呼叫顯示資料正常,退出再次進入該視窗是程式崩潰   原因是:不要使用臨時表#temp,最好使用表變數@temp 我的簡單理解即使你在儲存過程中刪除了臨時表,但是也會導致程式出錯   下面深刻認識一下臨時表和表變數吧

臨時記憶體表

前景 mysql三種虛擬表 臨時表 記憶體表 檢視 臨時表 簡介: 臨時表是建立在系統臨時資料夾中的表。臨時表的資料和表結構都儲存在記憶體之中,退出的時候所佔

ORACLE 臨時空間使用率過高的原因及解決方案

        在資料庫的日常學習中,發現公司生產資料庫的預設臨時表空間temp使用情況達到了30G,使用率達到了100%; 待調整為32G後,使用率還是為100%,導致磁碟空間使用緊張。根據臨時表空間的主要是對臨時資料進行排序和快取臨