天天看點

ORACLE體系結構

一,表空間 tablespace

    系統表空間       一定要online

    輔助表空間

    復原表空間       一定要online

    臨時表空間

    應用表空間

    SELECT * FROM Database_Properties      記錄db級的一些參數的預設值

    如預設表空間,預設臨時表空間,預設表空間類型

    1,建立表空間:

    create tablespace ts datafile '/u1/oradata/a/ts.dbf' size 10M

    extent management local autoallocate    也可為unifom size 1M

    segment space management auto;      也可為manual

    建立臨時表空間:

    create temporary tablespace mytemp tempfile '/u1/oradata/a/mytemp.dbf' size 10M

    extent management local uniform size 1M

    segment space management manual;

    臨時表空間隻可以用uniform size 和 manual

    設定表空間為DB的預設表空間

    alter database default tablespace ts

    設定某臨時表空間為DB的預設表空間

    alter database temporary tablespace mytemp

    查 Database_Properties發現預設表空間改變

    2,臨時表空間組 (10g新特性)

    用于解決同一使用者多個會話表空間争用問題

    建立臨時表空間組(添加組員):

    alter tablespace mytemp tablespace group g1;

    alter tablespace mytemp2 tablespace group g1;

    産生一個組後産生一個資料字典:SELECT * FROM Dba_Tablespace_Groups 可查

    将使用者的臨時表空間設定成該臨時表空間組

    alter user scott temporary tablespace g1

    将DB預設的臨時表空間設為該臨時表空間

    alter database default temporary tablespace g1;

    将臨時表空間成員從臨時表空間組中删除

    alter tablespace mytemp tablespace group '';

    v$tempfile 和 dba_temp_files差別?

    v$tempfile 在控制檔案中,mount狀态可讀。dba_temp_files在資料檔案中

    設計這兩個功能相近的資料字典是為了恢複友善

    3,輔助表空間,

    SELECT * FROM v$sysaux_occupants;  可檢視輔助表空間有哪些工具

    二,資料塊

    标準塊:大小和db_block_size一樣的塊

    非标準塊:大小和db_block_size不一樣的塊

    塊的大小

    塊小:每一塊中的記錄少,并發機率小,但是塊比較多,查詢速度慢

    塊大:并發機率大,但是查詢速度快

    若建表是塊大小已經比較大了,事後發現并發量太大如和做?

    調整pct_free

    複合型:

    在記憶體中每個塊的緩沖區大小show parameter cache_size可查

    若記憶體中預設cache_size 為8k有一個表的塊大小是16k,則需要在記憶體中開辟一段空間,器

    cache_size為16k。是以 cache中既有8k的空間又有16k的空間,是以稱為複合型

    alter system set db_32k_cache_size=20M    把32k的cache設定為20M大小

    可用dump oracle最底層剖析來分析

    三,對象管理

    1,表:

    分類:

    a,normal 對表

    b,分區表(友善維護,可以提高性能)

    c,索引組織表(IOT)

    d,簇表  會減少連結的代價:當需要兩個表連接配接時會生成一個簇表,查詢時減少連結代價

    表的屬性:    SELECT * FROM Dba_Tables;

    logging :預設寫日志,參照表空間的屬性

    initextent:不指定預設和表空間一緻

    pct_free

    pct_used

    ini_trans   事務槽的初始長度

    max_trans   事務槽的最大長度

    事務槽位于塊頭下面,當塊中記錄被修改了事務槽就記錄一條,如事務槽最大長度為200

    那麼當修改第201次記錄且之前事務都沒結束時會報錯

    建立表時指定事務槽大小:

    create table aaa(a int) max_trans=3;

    rowid 邏輯位址:rowid是不存在任何塊中,存在索引中

    前6位:對象ID(表或索引)     Dba_Objects

    7-9位:對象所在檔案ID        Dba_Data_Files      v$datafile

    10-15位:資料塊ID,針對資料檔案的

    16-18位:塊内行号

    SELECT dbms_rowid.rowid_object(ROWID) AS obj#,

    dbms_rowid.rowid_relative_fno(ROWID) AS file#,

    dbms_rowid.rowid_block_number(ROWID) AS block#,

    dbms_rowid.rowid_row_number(ROWID) AS row#

    FROM scott.dept;

    查dept表中所有記錄的rowid

    rowid 如何映射到塊内的行的?

    通過查詢索引,查到要查資訊的rowid。通過rowid的資訊查找到塊以及塊内的行号,若塊中那

    行記錄曾經alter并且新記錄沒有記錄在原來的部位,則原來的部位會記錄一個偏移量,進而找到該

    記錄的新位置

    消除碎片的方法:

    (1)move   (8i,9i)

    alter table ts move TBSNAME;

    show parameter user_segment 可查

    注意:move時全表鎖,做完後重建索引

    (2)shink  (10g新特性)

    原理:先排序後釋放空間

    要先讓表有行移動的功能:

    alter table test1 enable row movement

    排序:

    alter table test1 shink space compact

    釋放空間:

    alter table test1 shink space

    shink過程不會引發行級觸發器,但索引要重建

    (3)exp imp  備份恢複技術

    面試題:如何清空一個大表?

    若delete from  要寫日志

    若truncate 隻在資料字典中标記,并不删除資料釋放區間;

    是以要删除一個大表應該先回落HWL在系統空閑的時候在釋放空間:

    是以先truncate

    然後系統空閑時 alter table scott.tab1 deallocate unused keep 100m  釋放到還剩100m

    alter table scott.tab1 deallocate unused keep 0m    完全釋放

    建表時設定不記錄日志:

    create table scott.tab as select * from dba.objects nologging;

    删除表并釋放空間:

    truncate table scott.tab1 reuse storage

    2,索引:

    在無索引的情況下:要查找empno=7369的人的name時,要全表掃描,即使找到一個還是要繼續掃描全表

繼續閱讀