tom 9I-10g中關於dmp和資料磊檔案以及pga的一點分析

dotaddjj發表於2012-02-14

Expimpdmp

關於oracle的匯入 匯出工具跟oracle的版本的概念關係一直是迷迷糊糊的,跟網友們的討論一樣:高版本相容低版本。

這個解釋應該是export的匯出版本應該低於或等於imp的匯入版本。例如oracle 9i的資料庫伺服器無法用oracle 10g的客戶端匯出,由於dmp檔案的imp9I的,但是需要exp的版本卻是10g的,同樣還有10g客戶端匯出的dmp檔案無法匯入到oracle 9I的資料庫中。

Dmp檔案是平臺獨立的二進位制檔案,裡面儲存後設資料(createalert語句)和資料本身,只要是oracle版本允許可以匯入匯出到任何平臺,但是由於在windows和檔案ftp傳輸中,會默地把dmp檔案當成文字檔案,這樣會破壞dmp檔案,所以在windows和檔案ftp傳輸中選擇二進位制傳輸。

資料磊檔案:

Oracle 10g推出了資料磊格式,資料磊格式也是跨平臺的二進位制檔案,包含有儲存為xml的後設資料(不是createalter的語句),可能還包含資料,由於使用了xmlimpdpexpdp有一些複雜的過濾和轉換功能。Dmp檔案後設資料create alter語句在匯入工具執行sql需要解析每一條sqlimpdp只需要簡單的xml轉換就可以達到。

關於手動pga管理中排序sort_area_size測試

Session A執行

sql>create table sess_stats(name varchar2(80),value number,diff number);

--建立表sess_stats記錄排序操作中ugapga使用

SQL> alter session set workarea_size_policy=manual;

Session altered

SQL> alter session set sort_area_size=65536;--設定sort_area_size排序區為64KB

Session altered

SQL> select * from v$mystat where rownum=1;--記錄sid

SID STATISTIC# VALUE

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

126 0 1

在執行排序sql之前在session B執行merge into sql語句記錄此前的記錄資訊

Session B

Sql>merge into sess_stats

Using

(select name,value from v$statname a,v$sesstat b

Where a.statistic#=b.statistic#

And b.sid=$sid—輸出sid等於執行排序sqlsid

And (a.name like '%ga%' or a.name like '%direct temp%'))curr_stats

On(sess_stats.name=curr_stats.name)

When matched then

Update set diff=curr_stats.value-sess_stats.value,value=curr_stats.value

When not match then

Insert(name,value,diff) values(curr_stats.name,curr_stats.value,null);

/

Sql>Commit;

/

回到session A執行排序操作

Session A

set termout off

select * from t order by 1,2,3,4;

set termout on

執行完畢後再次在session b執行merge into更新記錄。

SQL> select * from sess_stats;

NAME VALUE DIFF

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

calls to kcmgas 5 2

session pga memory max 1302100 720896

session pga memory 581204 65536

session uga memory 221744 65464

session uga memory max 969932 682724

physical writes direct tempora 6108 3054

ry tablespace

physical reads direct temporar 6108 3054

y tablespace

可以看出在sort_area_size=64KB下,sql語句對臨時表空間執行了3054次讀和寫I/O,為了完成查詢和排序,oracle分配了排序區,pgauga都增大,session uga memory maxsession pga memory max 來執行排序sql,排序完畢後又回縮valuesession uga memorysession pga memory

類似當設定sort_area_size1MB,相應的pgauga 臨時表空間I/O

SQL> select * from sess_stats;

NAME VALUE DIFF

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

calls to kcmgas 5 0

session pga memory max 2416212 1114112

session pga memory 581204 0

session uga memory 221744 0

session uga memory max 1400096 430164

physical writes direct tempora 6801 693

ry tablespace

physical reads direct temporar 6801 693

類似使用1GBsort_area_size排序區,記錄的pgauga 臨時表空間I/O資訊

SQL> select * from sess_stats;

NAME VALUE DIFF

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

calls to kcmgas 5 0

session pga memory max 68345428 65929216

session pga memory 581204 0

session uga memory 287208 65464

session uga memory max 67331120 65931024

physical writes direct tempora 6801 0

ry tablespace

physical reads direct temporar 6801 0

y tablespace

自動pga記憶體管理:

儘可能充分的使用ram,而且儘量不會超過可用的pga_aggregate_target的大小。少量使用者時,會盡可能分配過多ram給使用者,隨著系統負載的增加,會最大限度使用記憶體,但是會減少每個使用者分配,然後隨著系統負載減少,為每個使用者分配的ram又將增加(但是出於系統記憶體需求,有時可能會大於這個值)

對於序列的session,每個工作區(排序區和雜湊區)最多隻能使用5%pga_aggregate_target

並行查詢的session,工作區最多隻能使用30%pga_aggregate_target記憶體,每個並行程式最多隻能使用0.3pga_aggregate_target/parallel n

少量使用者需要排序和雜湊時,oracle會分配更多的記憶體給少量使用者以減少磁碟I/O,而如果大量使用者需要排序和雜湊消耗記憶體時,oracle又會合理平衡的分配記憶體給相應使用者,在pga_aggregate_target的限制下充分使用記憶體。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1057351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章