一,表空間 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時,要全表掃描,即使找到一個還是要繼
續掃描全表
有索引的情況下
*