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));
在一個事務裡使用事務級的臨時表,執行計劃顯示產生了笛卡爾連線。
正常的執行計劃為:
為了避免資料庫引用錯誤的臨時表統計資訊:
- 建議:
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臨時表空間使用率達到多少記錄使用臨時表空間語句
臨時表空間with pct as (SELECT TABLE
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%,導致磁碟空間使用緊張。根據臨時表空間的主要是對臨時資料進行排序和快取臨