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 資料儲存是把表按照索引的方式儲存的,資料是有序的,資料的位置是預先定好的,與插入的順序沒有關係。索引表的查詢效率逼堆表高 相當於查...