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