SQL調優之九 堆組織表,索引組織表以及表聚簇

2022-07-25 14:09:17 字數 3422 閱讀 9181

說在最前頭,一切快慢都是相對來說的

預設情況下,我們用create table建立出來的表就是堆組織表,在往這種表裡面插入/匯入資料的時候不會按某種特殊排列方式的。

表中的每一行都有乙個獨一的rowid,當行移動的時候rowid也會跟著變化,即便是在同乙個heap裡面移動。

舉例來說,你從漢語詞典撕了幾頁出來,然後把它們堆到你面前的桌子上,這個時候你就得到乙個堆"表"。

1,你不用進行排序,這就是堆表的無序

2,你拿到一張紙就往上扔,所以插入很快

3,你要改一張紙的頁碼,所以你要從這堆紙裡面找到你要的那一張,因為無序,所以查詢很慢

4,改完你又把它往前面一扔就好了,所以存入很快

5,你更改的紙的位置在」堆」裡面變了,所以rowid會隨著位置改變

6,為了快點找到紙的位置,你要寫乙個目錄,就跟詞典的目錄一樣,這就是索引

7,索引寫著紙的位置,你通過索引找資料的時候,就是先看索引確定位置「rowid」,然後再去表裡找資料

8,你要找到其中的幾頁紙,因為位置隨機,所以通過全表掃瞄獲取到的資料的先後順序也是隨機的

總結:隨機i/o,插入快,查詢慢,這也就是為什麼我們平時建議要走索引的原因(一般情況)

索引組織表是以類似於b樹索引結構儲存的一種表結構。

1,在索引組織表中,行資料是和主鍵索引存放在一起的。因此該錶適用於經常檢索主鍵的情況

2,每乙個b數索引裡面的記錄含有其他非索引列的資料,因此可以減少儲存,同時也可以減少i/o

3,對索引組織表做dml操作的時候,等同於對索引做操作,它在插入的過程需要進行定位,找到指定的葉塊,然後再插入資料,某些極端情況下,它可能還要進行分塊,分枝幹的操作,所以dml操作相對於堆表來說要慢,不適合用於頻繁更新的表

4,索引組織表適用於文獻檢索,空間資料以及olap應用:

建立語法:

create table locations

(id number(10) not null,

description varchar2(50) not null,

map blob,

constraint pk_locations primary key (id)

)organization index

tablespace iot_tablespace

pctthreshold 20

including description

overflow tablespace overflow_tablespace;

row overflow area:因為iot表的索引和資料同時存在,所以有時候行資料可能出現溢位的情況,也就是太大了的情況,這個時候可以配置乙個row overflow area。

如果指定了行溢位空間,資料庫會把iot表分為兩部分:

這一部分包含了所有主鍵列的值,以及乙個指向溢位部分(在另乙個位置)的物理rowid,以及一部分非主鍵列的值。這一部分儲存在索引段上

這一部分則儲存剩下的非主鍵列的值,儲存在建立表時指定的溢位空間:overflow tablespace overflow_tablespace;

碎片化處理:

對於iot表變得碎片化的情況,可以用以下命令移動表:

沒有啟用overflow:

alter table table_name move initrans 10;

alter table table_name move online initrans 10;

啟用了overflow:

alter table table_name move tablespace iot_tablespace overflow tablespace overflow_tablespace;
堆組織表索引組織表rowid唯一識別行資料,

主鍵約束可以選擇性建立或者不

主鍵唯一識別行資料,

主鍵約束必須建立

rowid列裡的物理rowid允許建立第二個索引

rowid列裡的邏輯rowid允許建立第二個索引

單獨的行可以通過rowid直接訪問

單獨的行可以通過主鍵非直接訪問

順序全表掃瞄可以以某種順序返回所有行

全索引掃瞄或者快速全索引掃瞄可以以某種順序返回所有行

可以和其他表一起存在乙個表聚簇裡面

不可以可以有乙個long型別的列以及多個lob資料型別的列

可以有lob資料型別,但不能有long型別

可以包含虛擬列(僅有關係型堆組織表支援)

不可以含有虛擬列

乙個表聚簇是指共享同一/一些列的幾個表的組合,並且相關的資料會儲存在相同的資料塊裡面。

即幾個table,以相同的乙個或多個列作為cluster key,來建立乙個table cluster。

例子:乙個hr管理著兩個書櫃,

其中乙個書櫃上的盒子放著雇員的相關資料夾,--employee表

另乙個書櫃上的盒子則放著部門的相關資料夾,--department表

使用者經常要找某個部門裡面所有雇員的資訊,--經常按某種關聯關係來查詢資料

為了能更容易拿到想要的資料,hr決定把所有的盒子放到乙個書櫃上。--建立table cluster

這一次是按部門編號來劃分盒子,--cluster key,department_id列

比如,編號20的部門的所有相關檔案,比如說雇員的相關資訊以及部門本身的資訊,都會被放到同乙個盒子裡面;編號100的部門的所有相關資料夾,則會放到另乙個盒子。--相關資料會放到相同的資料塊裡面,並且department_id只存放一次

優點:不適合使用的情況:

索引化的聚簇

索引化的聚簇,是指在cluster key上的建立索引的聚簇,其必須在資料插入之前建立。

這種索引跟非聚簇的表上的索引是一樣的,是單獨管理的,同時也可以指定乙個單獨的表空間。

雜湊聚簇

雜湊聚簇跟索引聚簇是一樣的,只不過索引鍵替換成了乙個雜湊函式。

這種情況下沒有單獨的索引,資料即索引。

關於聚簇可以看下這個鏈結做的實驗:

Oracle效能調優 堆組織表和索引組織表區別

hot和iot的起源堆組織表的儲存速度因為不用考慮排序,所以儲存速度會比較快。但是要查詢符合某個條件的記錄,就必須得讀取全部的記錄以便篩選。而這個時候為了加快查詢速度,索引就出現了,索引是針對少量特定欄位的值拿出來進行排序儲存,並記錄在表中的位置,而因為索引是有序的,所以就會很容易通過索引查詢到具體...

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

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

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

1.堆組織表 通常我們預設建的表就是堆組織表。語法 create table test id int,name varchar2 10 此型別的表中,資料會以堆的方式進行管理,增加資料時候,會使用段中找到的第乙個能放下 此資料的自由空間。當從表中刪除資料時候,則允許以後的update和insert重...