以下的內容主要是介紹Oracle索引聚簇表的數據加載的兩個主要組成部分,其中包括對索引聚簇表的工作原理,以及Oracle索引聚簇表的數據加載創建過程的相關內容的描述,以下是文章內容的詳細介紹。
一:首先介紹一下索引聚簇表的工作原理
聚簇是指:如果一組表有一些共同的列,則將這樣一組表存儲在相同的數據庫塊中;聚簇還表示把相關的數據存儲在同一個塊上。利用聚簇,一個塊可能包含多個表的數據。概念上就是如果兩個或多個表經常做鏈接操作,那麼可以把需要的數據預先存儲在一起。聚簇還可以用於單個表,可以按某個列將數據分組存儲。
更加簡單的說,比如說,EMP表和DEPT表,這兩個表存儲在不同的segment中,甚至有可能存儲在不同的TABLESPACE中,因此,他們的數據一定不會在同一個BLOCK裡。而我們有會經常對這兩個表做關聯查詢,比如說:select * from emp,dept where emp.deptno = dept.deptno .仔細想想,查詢主要是對BLOCK的操作,查詢的BLOCK越多,系統IO就消耗越大。
如果我把這兩個表的數據聚集在少量的BLOCK裡,查詢效率一定會提高不少。比如我現在將值deptno=10的所有員工抽取出來,並且把對應的部門信息也存儲在這個BLOCK裡(如果存不下了,可以為原來的塊串聯另外的塊)。這就是索引聚簇表的工作原理。
二:創建過程
索引聚簇表是基於一個索引聚簇(index cluster)創建的。裡面記錄的是各個聚簇鍵。聚簇鍵和我們用得做多的索引鍵不一樣,索引鍵指向的是一行數據,聚簇鍵指向的是一個Oracle BLOCK。我們可以先通過以下命令創建一個Oracle索引簇。
- SQL> conn scott/tiger
已連接。
- SQL> desc dept
名稱 是否為空? 類型
- DEPTNO NOT NULL NUMBER(2)
- DNAME VARCHAR2(14)
- LOC VARCHAR2(13)
- SQL> create cluster emp_dept_cluster
- 2 ( deptno number(2) )
- 3 size 1024
- 4 /
簇已創建。
這個名字可以用戶定義,不一定叫deptno,數據類型必須和需要使用這個聚簇的數據類型一致NUMBER(2)。在這裡最關鍵的一個參數是size。這個選項原來告訴Oracle:我們希望與每個聚簇鍵值關聯大約1024字節的數據(1024對於一般的表一條數據沒問題),Oracle會在用這個數據庫塊上設置來計算每個塊最 多能放下多少個聚簇鍵。
假設塊大小為8KB,Oracle會在每個數據庫塊上放上最多7個聚簇鍵,也就是說,對應部門10、20、30、40、50、60和70的數據會放在一個塊上,一旦插入部門80,就會使用一個新塊。存放的數據是和插入順序相關的。
因 此,SIZE測試控制著每塊上聚簇鍵的最大個數。這是對聚簇空間利用率影響最大的因素。如果把這個SIZE設置得太高,那麼每個塊上的鍵就會很少(單位BLOCK可以存的聚簇鍵就少了),我們會不必要地使用更多的空間。如果設置得太低,又會導致數據過分串鏈(一個聚簇鍵不夠存放一條數據),這又與聚簇本來的目的不符,因為聚簇原本是為了把所有相關數據都存儲在一個塊上。
向聚簇中放數據之前,需要先對聚簇建立Oracle索引。可以現在就在聚簇中創建表,但是由於我們想同時創建和填充表,而有數據之前必須有一個聚簇索引,所以我們先來建立聚簇索引。
聚簇索引的任務是拿到一個聚簇鍵值,然後返回包含這個鍵的塊的塊地址。實際上這是一個主鍵,其中每個聚簇鍵值指向 聚簇本身中的一個塊。因此,我們請求部門10的數據時,Oracle會讀取聚簇鍵,確定相應的塊地址,然後讀取數據。聚簇鍵索引如下創建:
- SQL> create index emp_dept_cluster_idx
- 2 on cluster emp_dept_cluster
- 3 /
索引已創建。
現在可以創建表了:
- SQL> conn segment_study/liugao
已連接。
- SQL> create table dept
- 2 ( deptno number(2) primary key, 3 dname varchar2(14),
- 4 loc varchar2(13)
- 5 )
- 6 cluster emp_dept_cluster(deptno)
- 7 /
表已創建。
- SQL> create table emp
- 2 ( empno number primary key, 3 ename varchar2(10),
4 job varchar2(9), 5 mgr number, 6 hiredate date,
7 sal number, 8 comm number,- 9 deptno number(2) constraint emp_fk references
dept(deptno)- 10 )
- 11 cluster emp_dept_cluster(deptno)
- 12 /
表已創建。
我們可以通過一下SQL語句查看創建:
- SQL> select cluster_name, table_name
- 2 from user_tables
- 3 where cluster_name is not null
- 4 order by 1;
- CLUSTER_NAME TABLE_NAME
- EMP_DEPT_CLUSTER DEPT
- EMP_DEPT_CLUSTER EMP
現在,聚簇,聚簇索引,聚簇Oracle索引表都已經建立完成。