Oracle簇表介绍 (clustered table)
生活随笔
收集整理的這篇文章主要介紹了
Oracle簇表介绍 (clustered table)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簇表概述
簇表(cluster) 是一種可以選的存儲(chǔ)數(shù)據(jù)方式。簇表由1組擁有相同的列而且經(jīng)常被一起使用的數(shù)據(jù)表構(gòu)成,這組表在存儲(chǔ)時(shí)會(huì)共享一部分Data Blocks, 例如,employees 和 departments表都包含department_id 這個(gè)列。 當(dāng)用戶將這兩個(gè)表組合成1個(gè)簇表時(shí),Oracle在物理上將employees 和 departments 兩張表各行的department_id 字段存儲(chǔ)在1個(gè)Data block里。
下圖顯示了由employees 和 departments 兩張表構(gòu)成的簇表是怎樣存儲(chǔ)的。
?
如上圖,在1個(gè)簇表內(nèi),不同表的相關(guān)(related)數(shù)據(jù)行會(huì)被存儲(chǔ)到1個(gè)Data Block中,因此有如下優(yōu)點(diǎn):
???
??? * 連接(join) 簇表所需的磁盤I/O減少。
??? * 連接簇表時(shí)間減少
??? * 在1個(gè)簇表內(nèi),簇鍵(cluster key) 是指各簇鍵列(cluster key column)的值。1個(gè)簇內(nèi)的
?????? 有多個(gè)簇表的各個(gè)數(shù)據(jù)行所使用的相同的簇鍵值,在簇表及簇索引(cluster index)中只會(huì)被
?????? 存儲(chǔ)1次(參考上圖)。因此與非簇表相比(nonclustered table)相比,簇表這存儲(chǔ)相關(guān)的
?????? 表和表數(shù)據(jù)所需的空間會(huì)減少。? 如上圖所示, 每個(gè)簇鍵(department_id)的值只會(huì)存儲(chǔ)1次
?????? ,而兩張表employees和 departments 中包含的相同簇鍵值的數(shù)據(jù)共享同1個(gè)簇鍵.
簇表的一些屬性
簇鍵 cluster key
????? 簇鍵是列或多列的組合,為簇表所共有
????? 在創(chuàng)建簇表時(shí)指定簇鍵的列,以后在創(chuàng)建增加簇表中的每個(gè)表示,指定相同的列則可。
????? 每個(gè)簇鍵值在簇和簇索引中只存儲(chǔ)1次,與不同表中有多少這樣的行無關(guān)。
使用簇鍵的好處
????? 減少磁盤I/O, 減少了因使用連接表所帶來系統(tǒng)開銷
????? 節(jié)省了磁盤存儲(chǔ)空間,因?yàn)樵瓉硪獑为?dú)存放多張表,現(xiàn)在可以將連接的部分作為共享列存儲(chǔ)。
什么情況下創(chuàng)建簇表
????? 對(duì)于經(jīng)常查詢,DML操作比較少的表
???????? 表中的記錄經(jīng)常被連接到其他表查詢
創(chuàng)建簇表的步驟
???? 創(chuàng)建簇表
????? 創(chuàng)建簇索引
????? 創(chuàng)建簇表的子表
創(chuàng)建簇表時(shí)應(yīng)考慮的問題
???? 哪些表適用于創(chuàng)建簇表
????? 對(duì)于創(chuàng)建簇的表那些列用作簇列
????? 創(chuàng)建簇時(shí)Data Blocks的空間如何使用(pctfree, pctused)
????? 平均簇鍵及所需相關(guān)行所需的空間大小
????? 簇索引的位置(比如存放到不同表空間)
????? 預(yù)估簇的大小
?????
創(chuàng)建簇和簇表
在創(chuàng)建簇表時(shí),如果未指定索引列,則默認(rèn)的創(chuàng)建1個(gè)索引簇。
如果指定了散列參數(shù), 如haskeys,hashis 或single table hashkeys,則可以創(chuàng)建哈希簇.
先檢查當(dāng)前環(huán)境
可以看出當(dāng)前用戶是HR, 用戶的默認(rèn)表空間是TS_EXAMPLE
創(chuàng)建簇
?? CREATE CLUSTER EMP_DEPT_CLUSTER(DEPTNO NUMBER(2))
?? PCTUSED 80
?? PCTFREE 15
?? SIZE 1024
?? TABLESPACE USERS
上面語句就創(chuàng)建了1個(gè)簇,其中1個(gè)最重要的參數(shù)就是SIZE,需要為SIZE指定1個(gè)合適的值,如果太大,則每個(gè)塊僅存放少量的簇,造成空間浪費(fèi),太小又會(huì)形成很多數(shù)據(jù)鏈。
注意TABLESPACE 字句,這里我們會(huì)將這個(gè)簇放入U(xiǎn)SER 這個(gè)表空間中,而不是用戶HR默認(rèn)的表空間TS_EXAMPLE.
注意:本地管理類型的表空間中, PCTUSED的設(shè)置是無效的.
關(guān)于PCTUSED PCTFREE 的參數(shù)可以參考我的另1篇blog
http://nvd11.blog.163.com/blog/static/200018312201282354948602/
如下圖,利用上面語句創(chuàng)建了1個(gè)簇
?
創(chuàng)建后可以通過查看user_clusters 來檢索這個(gè)簇.
?
創(chuàng)建簇索引
??? 創(chuàng)建簇索引的條件:
????? * 模式中必須包含簇
??? ? * 必須具有create any index 的權(quán)限.
?? 簇索引的作用
???????? 用于1個(gè)簇鍵值并返回該簇鍵值的地址塊. (注意簇中,每1個(gè)簇鍵值只存儲(chǔ)1次啊)
???
?? 語法:
?????????? Create index emp_dept_cluster_idx
???????????????????????? on? cluster emp_dept_cluster
???? 創(chuàng)建后可以查看user_indexse來檢索這個(gè)簇索引
?
創(chuàng)建簇表
???? 創(chuàng)建簇表 cl_dept:
????? CREATE TABLE CL_DEPT(
?????????????????????? DEPTNO NUMBER(2) PRIMARY KEY,
?????????????????????? DNAME VARCHAR2(14),
?????????????????????? LOC VARCHAR2(13)
?????????????????????? )
??????????????? cluster emp_dept_cluster(deptno) --cluster關(guān)鍵字后面跟簇名、簇列
?????????????????????????????????????????????????????????????????????????????? --作用就是分配該表給指定簇,同時(shí)指定簇鍵.
?????
???? CREATE TABLE CL_EMP(
????????????????????? EMPNO NUMBER PRIMARY KEY,
????????????????????? ENAME VARCHAR2(10),
????????????????????? JOB1? VARCHAR(9),
????????????????????? MGR?? NUMBER,
????????????????????? HIREDATE DATE,
????????????????????? SAL?? NUMBER,
????????????????????? COMM? NUMBER,
????????????????????? DEPTNO NUMBER(2) REFERENCES CL_DEPT(DEPTNO)? --外鍵
????????????????????? )
??????????????? CLUSTER EMP_DEPT_CLUSTER(DEPTNO) ----cluster關(guān)鍵字后面跟簇名、簇列
創(chuàng)建后可以查看user_tables來檢索這兩張簇表
?
也可以從user_objects視圖里查看:
?
上圖兩個(gè)SYS開頭的index是建立主鍵時(shí)系統(tǒng)自動(dòng)建立的indexes.
下面對(duì)CL_DEPT 和 CL_EMP 插入數(shù)據(jù). 從scott帳號(hào)的表導(dǎo)入
?
記得commit;..
更改簇屬性
?????
?? 類似table
?可以用如下語句更改簇屬性
Alter Cluster EMP_DEPT_CLUSTER
??????? pctree 20;
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
簇表(cluster) 是一種可以選的存儲(chǔ)數(shù)據(jù)方式。簇表由1組擁有相同的列而且經(jīng)常被一起使用的數(shù)據(jù)表構(gòu)成,這組表在存儲(chǔ)時(shí)會(huì)共享一部分Data Blocks, 例如,employees 和 departments表都包含department_id 這個(gè)列。 當(dāng)用戶將這兩個(gè)表組合成1個(gè)簇表時(shí),Oracle在物理上將employees 和 departments 兩張表各行的department_id 字段存儲(chǔ)在1個(gè)Data block里。
下圖顯示了由employees 和 departments 兩張表構(gòu)成的簇表是怎樣存儲(chǔ)的。
?
如上圖,在1個(gè)簇表內(nèi),不同表的相關(guān)(related)數(shù)據(jù)行會(huì)被存儲(chǔ)到1個(gè)Data Block中,因此有如下優(yōu)點(diǎn):
???
??? * 連接(join) 簇表所需的磁盤I/O減少。
??? * 連接簇表時(shí)間減少
??? * 在1個(gè)簇表內(nèi),簇鍵(cluster key) 是指各簇鍵列(cluster key column)的值。1個(gè)簇內(nèi)的
?????? 有多個(gè)簇表的各個(gè)數(shù)據(jù)行所使用的相同的簇鍵值,在簇表及簇索引(cluster index)中只會(huì)被
?????? 存儲(chǔ)1次(參考上圖)。因此與非簇表相比(nonclustered table)相比,簇表這存儲(chǔ)相關(guān)的
?????? 表和表數(shù)據(jù)所需的空間會(huì)減少。? 如上圖所示, 每個(gè)簇鍵(department_id)的值只會(huì)存儲(chǔ)1次
?????? ,而兩張表employees和 departments 中包含的相同簇鍵值的數(shù)據(jù)共享同1個(gè)簇鍵.
簇表的一些屬性
簇鍵 cluster key
????? 簇鍵是列或多列的組合,為簇表所共有
????? 在創(chuàng)建簇表時(shí)指定簇鍵的列,以后在創(chuàng)建增加簇表中的每個(gè)表示,指定相同的列則可。
????? 每個(gè)簇鍵值在簇和簇索引中只存儲(chǔ)1次,與不同表中有多少這樣的行無關(guān)。
使用簇鍵的好處
????? 減少磁盤I/O, 減少了因使用連接表所帶來系統(tǒng)開銷
????? 節(jié)省了磁盤存儲(chǔ)空間,因?yàn)樵瓉硪獑为?dú)存放多張表,現(xiàn)在可以將連接的部分作為共享列存儲(chǔ)。
什么情況下創(chuàng)建簇表
????? 對(duì)于經(jīng)常查詢,DML操作比較少的表
???????? 表中的記錄經(jīng)常被連接到其他表查詢
創(chuàng)建簇表的步驟
???? 創(chuàng)建簇表
????? 創(chuàng)建簇索引
????? 創(chuàng)建簇表的子表
創(chuàng)建簇表時(shí)應(yīng)考慮的問題
???? 哪些表適用于創(chuàng)建簇表
????? 對(duì)于創(chuàng)建簇的表那些列用作簇列
????? 創(chuàng)建簇時(shí)Data Blocks的空間如何使用(pctfree, pctused)
????? 平均簇鍵及所需相關(guān)行所需的空間大小
????? 簇索引的位置(比如存放到不同表空間)
????? 預(yù)估簇的大小
?????
創(chuàng)建簇和簇表
在創(chuàng)建簇表時(shí),如果未指定索引列,則默認(rèn)的創(chuàng)建1個(gè)索引簇。
如果指定了散列參數(shù), 如haskeys,hashis 或single table hashkeys,則可以創(chuàng)建哈希簇.
先檢查當(dāng)前環(huán)境
可以看出當(dāng)前用戶是HR, 用戶的默認(rèn)表空間是TS_EXAMPLE
創(chuàng)建簇
?? CREATE CLUSTER EMP_DEPT_CLUSTER(DEPTNO NUMBER(2))
?? PCTUSED 80
?? PCTFREE 15
?? SIZE 1024
?? TABLESPACE USERS
上面語句就創(chuàng)建了1個(gè)簇,其中1個(gè)最重要的參數(shù)就是SIZE,需要為SIZE指定1個(gè)合適的值,如果太大,則每個(gè)塊僅存放少量的簇,造成空間浪費(fèi),太小又會(huì)形成很多數(shù)據(jù)鏈。
注意TABLESPACE 字句,這里我們會(huì)將這個(gè)簇放入U(xiǎn)SER 這個(gè)表空間中,而不是用戶HR默認(rèn)的表空間TS_EXAMPLE.
注意:本地管理類型的表空間中, PCTUSED的設(shè)置是無效的.
關(guān)于PCTUSED PCTFREE 的參數(shù)可以參考我的另1篇blog
http://nvd11.blog.163.com/blog/static/200018312201282354948602/
如下圖,利用上面語句創(chuàng)建了1個(gè)簇
?
創(chuàng)建后可以通過查看user_clusters 來檢索這個(gè)簇.
?
創(chuàng)建簇索引
??? 創(chuàng)建簇索引的條件:
????? * 模式中必須包含簇
??? ? * 必須具有create any index 的權(quán)限.
?? 簇索引的作用
???????? 用于1個(gè)簇鍵值并返回該簇鍵值的地址塊. (注意簇中,每1個(gè)簇鍵值只存儲(chǔ)1次啊)
???
?? 語法:
?????????? Create index emp_dept_cluster_idx
???????????????????????? on? cluster emp_dept_cluster
???? 創(chuàng)建后可以查看user_indexse來檢索這個(gè)簇索引
?
創(chuàng)建簇表
???? 創(chuàng)建簇表 cl_dept:
????? CREATE TABLE CL_DEPT(
?????????????????????? DEPTNO NUMBER(2) PRIMARY KEY,
?????????????????????? DNAME VARCHAR2(14),
?????????????????????? LOC VARCHAR2(13)
?????????????????????? )
??????????????? cluster emp_dept_cluster(deptno) --cluster關(guān)鍵字后面跟簇名、簇列
?????????????????????????????????????????????????????????????????????????????? --作用就是分配該表給指定簇,同時(shí)指定簇鍵.
?????
???? CREATE TABLE CL_EMP(
????????????????????? EMPNO NUMBER PRIMARY KEY,
????????????????????? ENAME VARCHAR2(10),
????????????????????? JOB1? VARCHAR(9),
????????????????????? MGR?? NUMBER,
????????????????????? HIREDATE DATE,
????????????????????? SAL?? NUMBER,
????????????????????? COMM? NUMBER,
????????????????????? DEPTNO NUMBER(2) REFERENCES CL_DEPT(DEPTNO)? --外鍵
????????????????????? )
??????????????? CLUSTER EMP_DEPT_CLUSTER(DEPTNO) ----cluster關(guān)鍵字后面跟簇名、簇列
創(chuàng)建后可以查看user_tables來檢索這兩張簇表
?
也可以從user_objects視圖里查看:
?
上圖兩個(gè)SYS開頭的index是建立主鍵時(shí)系統(tǒng)自動(dòng)建立的indexes.
下面對(duì)CL_DEPT 和 CL_EMP 插入數(shù)據(jù). 從scott帳號(hào)的表導(dǎo)入
?
記得commit;..
更改簇屬性
?????
?? 類似table
?可以用如下語句更改簇屬性
Alter Cluster EMP_DEPT_CLUSTER
??????? pctree 20;
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的Oracle簇表介绍 (clustered table)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 翻译: Oralce官方文档-- Dat
- 下一篇: 转译:Oracle 中 Object_i