IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫(kù)Oracle → ORACLE索引聚簇表的數(shù)據(jù)加載

ORACLE索引聚簇表的數(shù)據(jù)加載

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(1)

??? 一:首先介紹一下索引聚簇表的工作原理:

??? 聚簇是指:如果一組表有一些共同的列,則將這樣一組表存儲(chǔ)在相同的數(shù)據(jù)庫(kù)塊中;聚簇還表示把相關(guān)的數(shù)據(jù)存儲(chǔ)在同一個(gè)塊上。利用聚簇,一個(gè)塊可能包含多個(gè)表的數(shù)據(jù)。概念上就是如果兩個(gè)或多個(gè)表經(jīng)常做鏈接操作,那么可以把需要的數(shù)據(jù)預(yù)先存儲(chǔ)在一起。聚簇還可以用于單個(gè)表,可以按某個(gè)列將數(shù)據(jù)分組存儲(chǔ)。

??? 更加簡(jiǎn)單的說,比如說,EMP表和DEPT表,這兩個(gè)表存儲(chǔ)在不同的segment中,甚至有可能存儲(chǔ)在不同的TABLESPACE中,因此,他們的數(shù)據(jù)一定不會(huì)在同一個(gè)BLOCK里。而我們有會(huì)經(jīng)常對(duì)這兩個(gè)表做關(guān)聯(lián)查詢,比如說:select * from emp,dept where emp.deptno = dept.deptno .仔細(xì)想想,查詢主要是對(duì)BLOCK的操作,查詢的BLOCK越多,系統(tǒng)IO就消耗越大。如果我把這兩個(gè)表的數(shù)據(jù)聚集在少量的BLOCK里,查詢效率一定會(huì)提高不少。

??? 比如我現(xiàn)在將值deptno=10的所有員工抽取出來,并且把對(duì)應(yīng)的部門信息也存儲(chǔ)在這個(gè)BLOCK里(如果存不下了,可以為原來的塊串聯(lián)另外的塊)。這就是索引聚簇表的工作原理。

??? 二:創(chuàng)建過程。

??? 索引聚簇表是基于一個(gè)索引聚簇(index cluster)創(chuàng)建的。里面記錄的是各個(gè)聚簇鍵。聚簇鍵和我們用得做多的索引鍵不一樣,索引鍵指向的是一行數(shù)據(jù),聚簇鍵指向的是一個(gè)ORACLE BLOCK。我們可以先通過以下命令創(chuàng)建一個(gè)索引簇。

??? 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 /

??? 簇已創(chuàng)建。

??? 這個(gè)名字可以用戶定義,不一定叫deptno,數(shù)據(jù)類型必須和需要使用這個(gè)聚簇的數(shù)據(jù)類型一致NUMBER(2)。在這里最關(guān)鍵的一個(gè)參數(shù)是size。這個(gè)選項(xiàng)原來告訴Oracle:我們希望與每個(gè)聚簇鍵值關(guān)聯(lián)大約1024字節(jié)的數(shù)據(jù)(1024對(duì)于一般的表一條數(shù)據(jù)沒問題),Oracle會(huì)在用這個(gè)數(shù)據(jù)庫(kù)塊上設(shè)置來計(jì)算每個(gè)塊最 多能放下多少個(gè)聚簇鍵。假設(shè)塊大小為8KB,Oracle會(huì)在每個(gè)數(shù)據(jù)庫(kù)塊上放上最多7個(gè)聚簇鍵,也就是說,對(duì)應(yīng)部門10、20、30、40、50、60和70的數(shù)據(jù)會(huì)放在一個(gè)塊上,一旦插入部門80,就會(huì)使用一個(gè)新塊。存放的數(shù)據(jù)是和插入順序相關(guān)的。

??? 因 此,SIZE測(cè)試控制著每塊上聚簇鍵的最大個(gè)數(shù)。這是對(duì)聚簇空間利用率影響最大的因素。如果把這個(gè)SIZE設(shè)置得太高,那么每個(gè)塊上的鍵就會(huì)很少(單位BLOCK可以存的聚簇鍵就少了),我們會(huì)不必要地使用更多的空間。如果設(shè)置得太低,又會(huì)導(dǎo)致數(shù)據(jù)過分串鏈(一個(gè)聚簇鍵不夠存放一條數(shù)據(jù)),這又與聚簇本來的目的不符,因?yàn)榫鄞卦臼菫榱税阉邢嚓P(guān)數(shù)據(jù)都存儲(chǔ)在一個(gè)塊上。

??? 向聚簇中放數(shù)據(jù)之前,需要先對(duì)聚簇建立索引。可以現(xiàn)在就在聚簇中創(chuàng)建表,但是由于我們想同時(shí)創(chuàng)建和填充表,而有數(shù)據(jù)之前必須有一個(gè)聚簇索引,所以我們先來建立聚簇索引。

??? 聚簇索引的任務(wù)是拿到一個(gè)聚簇鍵值,然后返回包含這個(gè)鍵的塊的塊地址。實(shí)際上這是一個(gè)主鍵,其中每個(gè)聚簇鍵值指向 聚簇本身中的一個(gè)塊。因此,我們請(qǐng)求部門10的數(shù)據(jù)時(shí),Oracle會(huì)讀取聚簇鍵,確定相應(yīng)的塊地址,然后讀取數(shù)據(jù)。聚簇鍵索引如下創(chuàng)建:

??? SQL> create index emp_dept_cluster_idx

??? 2 on cluster emp_dept_cluster

??? 3 /

??? 索引已創(chuàng)建。

??? 現(xiàn)在可以創(chuàng)建表了:

??? 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 /

??? 表已創(chuàng)建。

??? 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 /

??? 表已創(chuàng)建。

??? 我們可以通過一下SQL語句查看創(chuàng)建:

??? 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

??? 現(xiàn)在,聚簇,聚簇索引,聚簇索引表都已經(jīng)建立完成。

#p#副標(biāo)題#e#

??? 三:加載數(shù)據(jù)。

??? 向聚簇索引表中加載數(shù)據(jù)是個(gè)很講究的事情,處理方法不對(duì),會(huì)使得聚簇的功能發(fā)揮不完全,降低查詢性能。

??? 方法1:

??? 首先,我增加一個(gè)很大的列char(1000),加這個(gè)列是為了讓EMP行遠(yuǎn)遠(yuǎn)大于現(xiàn)在的大小。使得一個(gè)1024的聚簇?zé)o法存儲(chǔ)一行記錄。不能加varchar2(1000),因?yàn)镺RACLE對(duì)varchar2存儲(chǔ)的原則是能省就省,如果數(shù)據(jù)數(shù)據(jù)不到1000,不會(huì)分配1000的空間的。char則是有多少用多少。呵呵。

??? SQL> begin

??? 2????? for x in ( select * from scott.dept )

??? 3 loop

??? 4 insert into dept

??? 5??? values ( x.deptno, x.dname, x.loc );

??? 6 insert into emp

??? 7 select *

??? 8????? from scott.emp 9???? where deptno = x.deptno;

??? 10 end loop;

??? 11 end;

??? 12 /

??? begin

??? *

??? 第1行出現(xiàn)錯(cuò)誤:

??? ORA-02032:聚簇表無法在簇索引建立之前使用

??? ORA-06512:在line 4

??? SQL> create index emp_dept_cluster_idx

??? 2 on cluster emp_dept_cluster

??? 3 ;

??? 索引已創(chuàng)建。

??? SQL> alter table emp disable constraint emp_fk;

??? 表已更改。

??? SQL> truncate cluster emp_dept_cluster;

??? 簇已截?cái)唷?/p>

??? SQL> alter table emp enable constraint emp_fk;

??? 表已更改。

??? SQL> alter table emp add data char(1000);

??? 表已更改。

??? 上面的執(zhí)行錯(cuò)誤說明聚簇表無法在簇索引建立之前使用。

??? 首先我們通過先加載emp表,后加載dept表的方式。

??? SQL> insert into dept

??? 2? select * from scott.dept;已創(chuàng)建4行。

??? SQL> insert into emp

??? 2? select emp.*, '*' from scott.emp;已創(chuàng)建14行。

關(guān)鍵詞標(biāo)簽:ORACLE索引

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法