首页 > 解决方案 > 如果共享列在(a 和 b)和(b 和 c)之间,我可以创建一个包含 3 个表 a、b 和 c 的集群吗?

问题描述

我想象这样的事情:

CREATE CLUSTER CLUSTER1
(table_a_PK number (2)), (table_b_PK nmber (2));

create index idx_table_a_PK on cluster1;
create index idx_table_b_PK on cluster1;

CREATE TABLE table_a
table_a_PK number (2) PRIMARY KEY,
other_row varchar(20)
CLUSTER cluster1;

CREATE TABLE table_b
table_b_PK number (2) PRIMARY KEY,
rowB number (2),
other_row2 varchar(20),

CONSTRAINT FK_rowB FOREIGN KEY (rowB) REFERENCES table_a (table_a_PK),
CLUSTER cluster1;

CREATE TABLE table_c
tabe_c_PK number (2) PRIMARY KEY,
rowC number (2),
other_row3 varchar(20),

CONSTRAINT FK_rowC FOREIGN KEY (rowC) REFERENCES table_b (table_b_PK),
CLUSTER cluster1;

我希望能够查询 5 个不同的表。他们只在 2 个表之间共享列。比如,1 和 2 共享一列,2 和 3 共享一列,3 和 4 共享一列,依此类推。我想利用集群,所以我想弄清楚人们在我的情况下是如何做到这一点的。

标签: sqloracle

解决方案


表簇是一组共享公共列并将相关数据存储在相同块中的表。当表被聚集在一起时,一个数据块可以包含来自多个表的行。

聚簇键是聚簇表共有的一列或多列。您在创建表簇时以及创建添加到表簇的每个表时指定簇键。

集群键值是一组特定行的集群键列的值。包含相同集群键值的所有数据在物理上存储在一起。每个集群键值在集群和集群索引中只存储一次,无论不同表有多少行包含该值。

一个好的簇键有足够多的唯一值,使得每个键值对应的一组行大约填满一个数据块。每个集群键值的行太少会浪费空间并导致可忽略不计的性能提升。集群键非常具体以至于只有几行共享一个公共值可能会导致块中的空间浪费,除非在集群创建时指定了一个小的 SIZE。

在您的情况下,我认为使用集群没有任何好处,除了您没有在所有表之间共享一个公共列。

https://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT-GUID-CC31365B-83B0-4E09-A047-BF1B79AC887A


推荐阅读