Oracle中的cluster是啥意思,它有啥作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中的cluster是啥意思,它有啥作用?相关的知识,希望对你有一定的参考价值。

希望能讲的详细一点,谢谢

大家对通常oracle中的cluster的理解是不准确的,经常和sql server中的cluster index混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的data row存储到同一block上。在sql server中的cluster index强制行根据index key按存储顺序存储,这一点和oracle中的IOT类似。

从下图中我们可以清楚的看到cluster 和非cluster 的一组table的物理存储的区别。在cluster中,单个block上的数据可能来自多个table,概念上可以存储“预连接”的数据。单个table也可以使用cluster,即根据某些column按组存储数据。如图中,所有部门ID为 20和 110的部门信息和员工信息的数据都将存储在同一block。注意,这里存储的并不是排序的数据(那是IOT的任务),存储的是按部门ID分组集合的数据,是以heap的方式存储的。因此,部门20刚好和部门110相邻,而部门99和部门100相距很远(硬盘的物理位置)。
当单个block放不下时,额外的block将链接到最初的block,来包容溢出的数据,这种方式和在IOT中溢出block非常相似。
现在我们看看如何创建一个cluster。在cluster中创建一系列table是很简单的,对象存储定义如PCTFREE,PCTUSED,INITIAL都是和cluster相关的,而不是和table相关。这是因为在cluster中存储了若干table,每个table在同一个block中拥有不同的PCTFREE没有意义。
SQL> create cluster e_d_cluster
2 (deptid number(2))
3 size 1024
4 /

Cluster created
这里首先创建了一个index cluster。这个cluster的key为 deptid,在table中这个列可以不命名为deptid,但数据类型number(2)必须匹配。Size选项是用来告诉oracle预计有1024
字节数据和每个cluser key相关。Oracle将使用这个信息来计算每个block能容纳的最大cluster key数目。因此size太高,在每一block将得到很少的key,并且将使用比需要的更多的空间;设置容量太低,将得到过多的数据连接,这将偏离使用cluster的目的。Size是cluster的重要参数。
现在我们来创建cluster index。在把数据放入之前,需要索引cluster。Cluster index的作用是存储一个cluster key,并且返回包含该key的block的地址。

SQL> create index e_d_cluster_idx
2 on cluster e_d_cluster
3 /

Index created
Cluster key 的index可以使用index所有的正常的存储参数,并且可以位于另一个tablespace。它是一个正常的index,能够索引到一个cluster,并且也包含一个完全null的条目。
我们在cluster中创建table:
SQL> create table department
2 (deptid number(2) primary key,
3 dname varchar2(14),
4 loc varchar2(13))
5 cluster e_d_cluster(deptid);

Table created

SQL> create table employee
2 (empid number primary key,
3 ename varchar2(10),
4 job varchar2(10),
5 mgr number,
6 hiredate date,
7 sal number,
8 comm number,
9 deptid number(2) references department(deptid))
10 cluster e_d_cluster(deptid);

Table created

这里创建table与普通的table唯一的区别就是使用了cluster关键字,我们往table中装载数据:
SQL> begin
2 for x in(select * from scott.dept)
3 loop
4 insert into department
5 values(x.deptno,x.dname,x.loc);
6 insert into employee
7 select * from scott.emp
8 where deptno = x.deptno;
9 end loop;
10 end;
11 /

PL/SQL procedure successfully completed
我们可以看到目前table中装载了如下数据:
SQL> select * from department;

DEPTID DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

SQL> select * from employee;

EMPID ENAME JOB MGR HIREDATE SAL COMM DEPTID
---------- ---------- ---------- ---------- ----------- ---------- ---------- ------
7782 CLARK MANAGER 7839 1981-6-9 2450 10
7839 KING PRESIDENT 1981-11-17 5000 10
7934 MILLER CLERK 7782 1982-1-23 1300 10
7369 SMITH CLERK 7902 1980-12-17 800 20
7566 JONES MANAGER 7839 1981-4-2 2975 20
7788 SCOTT ANALYST 7566 1982-12-9 3000 20
7876 ADAMS CLERK 7788 1983-1-12 1100 20
7902 FORD ANALYST 7566 1981-12-3 3000 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
7698 BLAKE MANAGER 7839 1981-5-1 2850 30
7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
7900 JAMES CLERK 7698 1981-12-3 950 30

现在我们看看这两个table数据存储的位置:

SQL> select dbms_rowid.rowid_block_number(department.rowid) dept_rid,
2 dbms_rowid.rowid_block_number(employee.rowid) emp_rid,department.deptid
3 from department,employee
4 where employee.deptid = department.deptid;

DEPT_RID EMP_RID DEPTID
---------- ---------- ------
5587 5587 10
5587 5587 10
5587 5587 10
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30

可以看到部门ID相同的数据存储在一个block上。我们为什么推荐上述方法对cluster进行最初的装载呢?这样能够保证如果有些cluster key的相关数据超过了size,仍能使大部分数据聚集在一个block上。这只适用于最初的数据装载,在这以后,可以使用事务对cluster中的table insert数据。

由于cluster中的特殊的数据存储方式,出现了这样一个问题,rowid出现了重复,现在rowid只能在一个table中唯一标识一行数据了(另一种rowid重复出现在transport tablespace的操作后)。
SQL> select rowid from department
2 intersect
3 select rowid from employee;

ROWID
------------------
AAAGWQAADAAABXTAAA
AAAGWQAADAAABXTAAB
AAAGWQAADAAABXTAAC
AAAGWQAADAAABXTAAD
参考技术A Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column。
并把不同table在这一共享column上值相同的data row存储到同一block上。
在sql server中的cluster index强制行根据index key按存储顺序存储,这一点和oracle中的IOT类似。
参考技术B   大家对通常oracle中的cluster的理解是不准确的,经常和sql server中的cluster index混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的data row存储到同一block上。在sql server中的cluster index强制行根据index key按存储顺序存储,这一点和oracle中的IOT类似。 参考技术C oracle中的cluster是指oracle RAC,是oracle数据库的集群工具,可以对oracle做HA(高可用性)和load balance(负载均衡)。主要用来数据库故障自动切换,实现无故障停机。 参考技术D 第104回段家庄重招新女婿房山寨双并旧强人

CDATA 到底是啥,它有啥作用?

【中文标题】CDATA 到底是啥,它有啥作用?【英文标题】:What exactly is CDATA and what does it do?CDATA 到底是什么,它有什么作用? 【发布时间】:2011-04-18 08:02:22 【问题描述】:

我有时会注意到被<![CDATA[]]> 标签包围的CSS 或JS 代码。我找不到任何解释。 CDATA 是做什么的?为什么有些人会使用它,它有什么需要?

【问题讨论】:

另见***.com/questions/3577524/… 【参考方案1】:

它告诉解释器它不应该尝试解释包含在标签中的数据。例如,如果您希望 XML 文件包含带有 的注释,XML 解释器将报告该文件无效,因为字符 不是标准标记的一部分。您只需用 CDATA 标记包围代码即可。

【讨论】:

但是 【参考方案2】:

当您在 HTML 文件中编写内联 javascript 或 CSS(使用 scriptstyle 标记)时,这些 CDATA cmets 可防止 HTML 验证器在验证 HTML 文档时捕获误报。

【讨论】:

【参考方案3】:

这里有一些信息给你:http://en.wikipedia.org/wiki/CDATA

你怎么在这上面找不到任何东西是个谜;)

【讨论】:

【参考方案4】:

它标记不应解析的数据 - 在大多数情况下,只是 HTML 或需要直接写入页面的文本。

进一步解释:http://www.w3schools.com/xml/xml_cdata.asp

【讨论】:

准确地说,数据不应该被 XHTML 渲染引擎解析为 XML /。

以上是关于Oracle中的cluster是啥意思,它有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

流是啥意思?它有啥特点?

CDATA 到底是啥,它有啥作用?

传递给 history.pushState 的状态对象是啥,它有啥作用?

Dart 的“Expando”功能是啥,它有啥作用?

Django 中的 r'^admin/' , 请问中间的斜杠 / 是啥意思, 有啥作用?

Python 中的lambda 是啥意思,有啥作用,如何使用?