數據庫表筆記

|||數據庫表
|數據庫表的類型——堆組織表/heap organized table
| 索引組織表/index organized table
| 索引聚簇表/index clustered table
| 散列聚簇表/hash clustered table
| 有序散列聚簇表/sorted hash clusterd table
| 嵌套表/nested table
| 臨時表/temporary table
| 對象表/object table
| 外部表/external table

|||段空間管理
|——手動段空間管理(manual segment space management,MSSM)
| 空間管理參數需要設置FREELISTS、FREELIST GROUPS、PCRFREE、PCTUSED等參數
|
|——自動段空間管理(automatic segment space management,ASSM)
| 空間管理參數只需要設置PCTFREE即可,其他參數會自動忽略
| INITRANS,同一塊上初始的併發事務數
| MAXTRANS,9i使用,10g以後默認爲255,10g以後可忽略
| BUFFER_POOL
| 段空間管理繼承自表空間管理,所以ASSM的段必須要放在支持ASSM的表空間中

|||高水位線
|——HWM首先在新建表的第一個塊中,隨着表中放入數據,使用越多的塊後,HWM會升高;當刪除其中的某些行時,可能會有很多塊不含數據,
| 但是這些塊仍舊在HWM之下,直到對象被從建或者收縮。
|
|——Oracle在全面掃描段時會掃描HWM之下的所有塊,即使其中不包含任何數據,這樣就會影響全面掃描的性能。
|——MSSM中,WHM推進時,所有塊都會格式化並立即有效;ASSM中,HWM推進時,並不會立即格式化所有塊,只在第一次使用塊時完成格式化。
|——ASSM中有一個低HWM,低HWM之下的塊都被格式化;在插入數據時,新數據會插入到低HWM和高HWM之間,因此低與高HWM之間的許多塊沒有
| 被格式化。因此在進行全面掃描的時候,爲了減少對每個塊是否“安全”或是否未格式化的檢查,oracle直接會讀取並處理低HWM之下的
| 塊,而對低、高HWM之間的塊進行一種更安全的檢查措施,需要查看其所用的ASSM位圖信息來判斷應該讀取或忽略哪些塊。

|||FREELIST
|——使用MSSM表空間時,oracle會在FREELIST中爲有自由空間的對象維護其HWM以下的塊。
|——只有HWM之下的塊才能出現在FREELIST中,當FREELIST爲空時,oracle會推進HWM,並把這些新增的塊放入FREELIST中,也就是說,oracle
| 會延遲到不得已時才增加對象的HWM。
|——一個對象可以有1至多個FREELIST,可以根據需要把塊放在FREELIST上或者從FREELIST刪除。合理的FREELIST數對性能優化有極大好處。
| 當然不是越大越好,多個FREELIST是由一個主FREELIST管理其他的FREELIST,每個FREELIST進程只管理自身FREELIST,可能出現一個FREE
| LIST進程的塊列表空了,而其他FREELIST進程沒空,但此時會導致空了的進程訪問主FREELIST進程,如果主FREELIST進程中的塊列表也
| 空的情況下會申請推進HWM,過多的此種現象會導致表不必要的佔用稍多磁盤空間。大規模導入數據的時候可以增大FREELIST數,操作完
| 後再修改爲合適的數目,比如:5
|——ASSM表空間管理無FREELIST概念。

|||PCTFREE和PCTUSED
|——PCTFREE是一個“自由空間”閥值,默認:10%。表示塊最少要保留至少PCTFREE的空間以供以後update。
|——PCTUSED是一個“非自由空間”閥值,默認:40%。表示塊中的數據減少到PCTUSED後纔可以繼續insert。
|——簡單理解爲數據塊裏的數據增加到100%-pctfree的容量時就停止insert但可以update,等到塊中的數據減少到pctused的容量時纔可以繼
| 續insert。
|——PCTFREE對MSSM和ASSM都有意義,PCTUSED只對MSSM有意義。同樣是ASSM或者MSSM,PCTFREE在不同的表類型中有所差別,比如:IOT。
|——PCTFREE設計的太大會浪費磁盤空間,設計的太小可能會出現行遷移和行串聯
|——行遷移:指某一行從最初插入的塊上移動另外的某個塊上,並且會在原來塊上保留一個轉發地址,指向新的塊,原因是可能有索引物理
| 的指向原塊地址。此問題出現過多會影響系統性能。



|||索引組織表(IOT)
| 是存儲在索引結構中的表,按主鍵順序存儲和排序。IOT不存在主鍵的空間開銷,索引就是數據,數據就是索引。
| 比較適合按主鍵進行訪問,並且能保證數據按主鍵以某種特定的順序進行物理存儲,以select爲主的表。
| 如果有較多更新、插入則不太適合IOT類型的表。
| 建表語句:
create table iot_table(
ID varchar2 ( 10 ),
NAME varchar2 ( 20 ),
constraint pk_id primary key ( ID,NAME )
)
organization index --定義爲索引組織表
overflow --指定設置“行溢出”
PCTTHRESHOLD 20 --每一行數據最多佔用索引塊的20%,超出20%的則放入溢出段
INCLUDING name --指定列之前的列(包括指定列)都放入索引塊,之後的列都放到溢出段
tablespace iot_tablespace;

| 查看錶的DDL語句:
select dbms_metadata.get_ddl('TABLE','table_name') from dual;

| nocompress, compress 1, compress 2 壓縮選項:
analyze index idx_name validate structure; -- 分析索引並填寫一個名爲index_stats的動態性能視圖
select lf_blks,br_blks,used_space,opt_cmpr_count,opt_cmpr_pctsave from index_stats;
alter table iot_table move compress 1; --根據opt_cmpr_count爲1或者2得到“最優壓縮數”
alter table iot_table move compress 2;



|||索引聚簇表
一般爲有一組表,有一些共同的列,將這些表存儲在相同的數據塊中,或者將相關的數據存儲在同一個塊上,這種類型的表就是聚簇表。
聚簇並不有序的存儲數據(IOT如此),它是按某個鍵以聚簇方式存儲數據,但數據存儲在堆中。

1、創建聚簇
create cluster emp_dept_cluster
(deptno number(2)) --聚簇鍵
size 1024;
size--指每個聚簇鍵最多關聯1024字節的數據,也就是控制每塊上聚簇鍵的最大個數,設置小了容易引起塊串連,大了容易浪費空間。此參數是聚簇最重要的參數。

2、創建聚簇索引
create index emp_dept_cluster_idx
on cluster emp_dept_cluster;

3、創建聚簇表
create table dept
(deptno number(2) primary key,
dname varchar2(14),
loc varchar2(14)
)
cluster emp_dept_cluster(deptno);

create table emp
(empno number primary key,
ename varchar2(10),
job varchar2(10),
deptno number(2) reference dept(deptno) --需要在此字段上創建索引
)
cluster emp_dept_cluster(deptno);

4、不適合用聚簇的地方
4.1 大量修改操作
4.2 全表掃描多
4.3 需要進行表分區(cluster table不能進行表分區)
4.4 需要頻繁truncate和加載表

5、如果總是讀並且通過索引來讀,還要通過索引將幾個表連接在一起。也就是在邏輯上相關且總在一起使用的表,可以合適爲聚簇表。



|||散列聚簇表
與索引聚簇表很相似,只是聚簇鍵索引被一個散列函數所取代。表中的數據就是索引。
oracle會取得一行的鍵值,使用某個內部或自定義的散列函數進行散列計算,然後根據散列值得出數據在磁盤的哪個位置。
散列算法只能通過確定的值來使用,這就說明如果通過範圍、區間掃描字段則需要在其字段上增加傳統索引。
一開始就要分配空間——HASHKEYS/truncate(blocksize/SIZE) 個塊空間,並完成格式化。
HASHKEYS固定,除非重建聚簇,此參數值隻影響散列鍵數,不影響表記錄數,但是太低會影響性能能。

1、創建散列聚簇
create cluster hash_cluster
(hash_key number) --散列聚簇鍵
hashkeys 9000 --散列鍵值數,實際上爲最接近hashkeys的一個質數。
size 1024 --每個鍵值關聯的數據大小
tablespace assm
/

2、創建表
create table hashed_table
( x number, data1 varchar2(500), data2(500))
cluster hash_cluster(x);

3、建索引
alter table hashed_table add constraint t_hashed_pk primary key(x);

4、分析表
begin
dbms_stats.gather_table_stats( sms, 'HASHED_TABLE' );
end;
/

5、對散列聚簇表索引來說查詢時一個CPU密集型的工作,對傳統的索引來說是I/O密集型的工作。隨着數據增加散列聚簇查詢可以更好擴展。

6、單表散列聚簇: 一次只支持聚簇中的一個表。
create cluster hash_cluster
(hash_key number) --散列聚簇鍵
hashkeys 9000 --散列鍵值數,實際上爲最接近hashkeys的一個質數。
size 1024 --每個鍵值關聯的數據大小
single table
hash is HASH_KEY
/

7、適用範圍
7.1 清楚有多少行記錄
7.2 與select操作相比,dml操作很輕。
7.3 經常通過hashkey訪問數據。



|||有序散列聚簇表
爲10g新增,結合了散列聚簇和IOT的特性,經常按某鍵獲取數據,但要求按另外某列排序的情況下可以採用此種表。

1、創建聚簇
create cluster shc
(
cust_id number,
order_dt timestamp sort
)
hashkeys 10000
hash is cust_id
size 1024
/

2、創建表
create table cust_orders
( cust_id number,
order_dt timestamp sort,
......
......
)
cluseter shc(cust_id,order_dt)
/

3、除具足散列聚簇表的限制之外,還需要一個約束,即儘可保證數據按鍵值的有序順序到達。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章