欢迎来到天天文库
浏览记录
ID:34724960
大小:148.68 KB
页数:11页
时间:2019-03-10
《oracle中聚簇表的使用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Oracle中ClusterTable的使用大家通常oracle中的cluster的理解是不准确的,经常和sqlserver中的clusterindex混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的datarow存储到同一block上。在sqlserver中的clusterindex强制行根据indexkey按存储顺序存储,这一点和oracle中的IOT类似。从下图中我们可以清楚的看到cluster和非cluster的一组tabl
2、e的物理存储的区别。在cluster中,单个block上的数据可能来自多个table,概念上可以存储“预连接”的数据。单个table也可以使用cluster,即根据某些column按组存储数据。如图中,所有部门ID为20和110的部门信息和员工信息的数据都将存储在同一block。注意,这里存储的并不是排序的数据(那是IOT的任务),存储的是按部门ID分组集合的数据,是以heap的方式存储的。因此,部门20刚好和部门110相邻,而部门99和部门100相距很远(硬盘的物理位置)。当单个block放不下时,额外的block将链接到最初的bloc
3、k,来包容溢出的数据,这种方式和在IOT中溢出block非常相似。现在我们看看如何创建一个cluster。在cluster中创建一系列table是很简单的,对象存储定义如PCTFREE,PCTUSED,INITIAL都是和cluster相关的,而不是和table相关。这是因为在cluster中存储了若干table,每个table在同一个block中拥有不同的PCTFREE没有意义。SQL>createclustere_d_cluster2(deptidnumber(2))3size10244/Clustercreated这里首先创建了一个
4、indexcluster。这个cluster的key为deptid,在table中这个列可以不命名为deptid,但数据类型number(2)必须匹配。Size选项是用来告诉oracle预计有1024字节数据和每个cluserkey相关。Oracle将使用这个信息来计算每个block能容纳的最大clusterkey数目。因此size太高,在每一block将得到很少的key,并且将使用比需要的更多的空间;设置容量太低,将得到过多的数据连接,这将偏离使用cluster的目的。Size是cluster的重要参数。现在我们来创建clusterin
5、dex。在把数据放入之前,需要索引cluster。Clusterindex的作用是存储一个clusterkey,并且返回包含该key的block的地址。SQL>createindexe_d_cluster_idx2onclustere_d_cluster3/IndexcreatedClusterkey的index可以使用index所有的正常的存储参数,并且可以位于另一个tablespace。它是一个正常的index,能够索引到一个cluster,并且也包含一个完全null的条目。我们在cluster中创建table:SQL>createt
6、abledepartment2(deptidnumber(2)primarykey,3dnamevarchar2(14),4locvarchar2(13))5clustere_d_cluster(deptid);TablecreatedSQL>createtableemployee2(empidnumberprimarykey,3enamevarchar2(10),4jobvarchar2(10),5mgrnumber,6hiredatedate,7salnumber,8commnumber,9deptidnumber(2)referen
7、cesdepartment(deptid))10clustere_d_cluster(deptid);Tablecreated这里创建table与普通的table唯一的区别就是使用了cluster关键字,我们往table中装载数据:SQL>begin2forxin(select*fromscott.dept)3loop4insertintodepartment5values(x.deptno,x.dname,x.loc);6insertintoemployee7select*fromscott.emp8wheredeptno=x.dept
8、no;9endloop;10end;11/PL/SQLproceduresuccessfullycompleted我们可以看到目前table中装载了如下数据:SQL>select*fromde
此文档下载收益归作者所有