堆組織表,索引組織表和索引聚簇表

2021-05-26 12:31:40 字數 3013 閱讀 1286

1. 堆組織表:

通常我們預設建的表就是堆組織表。

語法:create table test(  

id int,  

name varchar2(10)  

);此型別的表中,資料會以堆的方式進行管理,增加資料時候,會使用段中找到的第乙個能放下

此資料的自由空間。當從表中刪除資料時候,則允許以後的update和insert重用這部分空間,

它是以一種有些隨機的方式使用。

很多初學者會想當然的以為資料的插入會按順序進行,第一條肯定排在第一位,接著是第二條,一直到最後。

可當select查詢的時候,返回的結果往往讓人失望。排列的順序讓人大跌眼鏡,下面來看乙個例子。

create table t(   

a int,  

b varchar2(4000) default rpad('*', 4000, '*'),  

c varchar2(3000) default rpad('*', 3000,'*')  

);  

insert into t(a) values (1);  

insert into t(a) values (2);  

insert into t(a) values (3);  

delete from t where a=2;  

insert into t(a) values (4);  

sql> select a from t;  

a  ----------  

1  4  

3 全表掃瞄時,會按命中的順序來獲取資料,而不是按插入的順序。

這是乙個必要要了解的重要的資料庫概念。一般來說,資料庫表本質上是無序的資料組合。 

2. 索引組織表(index organized table, iot):就是儲存在乙個索引結構中的表,資料按主鍵進行儲存和排序。

適用的場景:

a.完全由主鍵組成的表。這樣的表如果採用堆組織表,則表本身完全是多餘的開銷,

因為所有的資料全部同樣也儲存在索引裡,此時,堆表是沒用的。

b.**查詢表。如果你只會通過乙個主鍵來訪問乙個表,這個表就非常適合實現為iot.

c.如果你想保證資料儲存在某個位置上,或者希望資料以某種特定的順序物理儲存,iot就是一種合適的結構。 iot提供如下的好處:

·提高緩衝區快取效率,因為給定查詢在快取中需要的塊更少。

·減少緩衝區快取訪問,這會改善可擴縮性。

·獲取資料的工作總量更少,因為獲取資料更快。

·每個查詢完成的物理i/o更少。

如果經常在乙個主鍵或唯一鍵上使用between查詢,也是如此。如果資料有序地物理儲存,就能提公升這些查詢的效能。

語法:create table indextable(

id varchar2 (10), 

name varchar2 (20), 

constraint pk_id primary key (id)

) organization index;

3. 索引聚簇表:

聚簇是指:如果一組表有一些共同的列,則將這樣一組表儲存在相同的資料庫塊中;聚簇還表示把相關的資料儲存在同乙個塊上。

利用聚簇,乙個塊可能包含多個表 的資料。概念上就是如果兩個或多個表經常做鏈結操作,那麼可以把需要的資料預先儲存在一起。

聚簇還可以用於單個表,可以按某個列將資料分組儲存。  

語法:索引聚簇表是基於乙個索引聚簇(index cluster)建立的。

裡面記錄的是各個聚簇鍵。聚簇鍵和我們用得做多的索引鍵不一樣,索引鍵指向的是一行資料,

聚簇鍵指向的是乙個oracle block。我們可以先通過以下命令建立乙個索引簇。

create cluster emp_dept_cluster

( deptno number(2) )

size 1024

/ size引數:

向聚簇中放資料之前,需要先對聚簇建立索引。可以現在就在聚簇中建立表,

但是由於我們想同時建立和填充表,而有資料之前必須有乙個聚簇索引,所以我們先來 建立聚簇索引。

create index emp_dept_cluster_idx

on cluster emp_dept_cluster

/建表:

create table dept

( deptno number(2) primary key, 

dname varchar2(14),

loc varchar2(13)

)cluster emp_dept_cluster(deptno)

/ create table emp

(  empno    number primary key, 

ename    varchar2(10), 

job      varchar2(9), 

mgr      number, 

hiredate date, 

sal      number, 

comm     number,

deptno number(2) constraint emp_fk references dept(deptno)

) cluster emp_dept_cluster(deptno)

/ 什麼時候不應該使用聚簇?

1) 如果預料到聚簇中的表會大量修改:

必須知道,索引聚簇會對dml的效能產生某種負面影響(特別是insert語句)。管理聚簇中的資料需要做更多的工作。

2) 如果需要對聚簇中的表執行全表掃瞄:不只是必須對你的表中的資料執行全面掃瞄,

還必須對(可能的)多個表中的資料進行全面掃瞄。由於需要掃瞄更多的資料, 所以全表掃瞄耗時更久。

3) 如果你認為需要頻繁地truncate和載入表:聚簇中的表不能截除。

這是顯然的,因為聚簇在乙個塊上儲存了多個表,必須刪除聚簇表中的行。

因此,如果資料主要用於讀(這並不表示「從來不寫」;聚簇表完全可以修改),

而且要通過索引來讀(可以是聚簇鍵索引,也可以是聚簇表上的其他索引),

另外 會頻繁地把這些資訊聯結在一起,此時聚簇就很適合。

mysql堆表和索引組織 堆表與索引組織表

堆表 資料存放在資料裡面,索引存放在索引裡 堆就是無序資料的集合,索引就是將資料變得有序,在索引中鍵值有序,資料還是無序的 堆表中,主鍵索引和普通索引一樣的,葉子節點存放的是指向堆表中資料的指標 可以是乙個頁編號加偏移量 指向實體地址,沒有回表的說法 堆表中,主鍵和普通索引基本上沒區別,和非空的唯一...

堆表和索引組織表區別

堆表 heap table 資料插入時時儲存位置是隨機的,主要是資料庫內部塊的空閒情況決定,獲取資料是按照命中率計算,全表掃表時不見得先插入的資料先查到。索引表 iot 資料儲存是把表按照索引的方式儲存的,資料是有序的,資料的位置是預先定好的,與插入的順序沒有關係。索引表的查詢效率逼堆表高 相當於查...

堆表和索引組織表區別

堆表 heap table 資料插入時時儲存位置是隨機的,主要是資料庫內部塊的空閒情況決定,獲取資料是按照命中率計算,全表掃表時不見得先插入的資料先查到。索引表 iot 資料儲存是把表按照索引的方式儲存的,資料是有序的,資料的位置是預先定好的,與插入的順序沒有關係。索引表的查詢效率逼堆表高 相當於查...