一、聚簇概念定义
聚簇表是一种特殊的结构。一个聚簇由多个表组成,几个表共享相同的数据块。
一个聚簇有一个或者多个公共的列,多表共享这些列,我们把这样的列叫聚簇关键字(Cluster key)
oracle 把多个表的数据物理地址存储在一起,以加速表的连接
创建聚簇后,才能在聚簇中创建表,这些表叫聚簇表,在往聚簇表中插入数据之前必须在聚簇是上创建聚簇索引。
只有满足下面两个条件才适合使用聚簇
1、建立聚簇表的目的是为了查询,不是为了修改,频繁修改的表不适合创建成聚簇表
2、查询时,常常对聚簇中的多个表进行连接,
二、创建聚簇
create cluster cl_sales_customers(cust_id number)
create cluster 指定创建聚簇,cl_sales_customers 是聚簇的名字;cust_id是聚簇关键字,聚簇中的所有聚簇表共享这一列。
本例创建sales 表和customers表关联需要用到的关键字cust_id
三、创建聚簇表
创建聚簇表的实质就是把表加入到聚簇中,在创建聚簇表之前,必须创建好聚簇。
根据刚才创建的聚簇 salses表和customers表关联的聚簇cl_sales_customers
再创建聚簇表 SALES_FOR_CL
CREATE TABLE SALES_FOR_CL
( PROD_ID NUMBER NOT NULL ENABLE,
CUST_ID NUMBER NOT NULL ENABLE,
TIME_ID DATE NOT NULL ENABLE,
CHANNEL_ID NUMBER NOT NULL ENABLE,
PROMO_ID NUMBER NOT NULL ENABLE,
QUANTITY_SOLD NUMBER(10,2) NOT NULL ENABLE,
AMOUNT_SOLD NUMBER(10,2) NOT NULL ENABLE
)
CLUSTER cl_sales_customers(cust_id)
创建聚簇表CUSTOMERS_FOR_CL
CREATE TABLE CUSTOMERS_FOR_CL
( CUST_ID NUMBER NOT NULL ENABLE,
CUST_FIRST_NAME VARCHAR2(20) NOT NULL ENABLE,
CUST_LAST_NAME VARCHAR2(40) NOT NULL ENABLE,
CUST_GENDER CHAR(1) NOT NULL ENABLE,
CUST_YEAR_OF_BIRTH NUMBER(4,0) NOT NULL ENABLE,
CUST_MARITAL_STATUS VARCHAR2(20),
CUST_STREET_ADDRESS VARCHAR2(40) NOT NULL ENABLE,
CUST_POSTAL_CODE VARCHAR2(10) NOT NULL ENABLE,
CUST_CITY VARCHAR2(30) NOT NULL ENABLE,
CUST_CITY_ID NUMBER NOT NULL ENABLE,
CUST_STATE_PROVINCE VARCHAR2(40) NOT NULL ENABLE,
CUST_STATE_PROVINCE_ID NUMBER NOT NULL ENABLE,
COUNTRY_ID NUMBER NOT NULL ENABLE,
CUST_MAIN_PHONE_NUMBER VARCHAR2(25) NOT NULL ENABLE,
CUST_INCOME_LEVEL VARCHAR2(30),
CUST_CREDIT_LIMIT NUMBER,
CUST_EMAIL VARCHAR2(30),
CUST_TOTAL VARCHAR2(14) NOT NULL ENABLE,
CUST_TOTAL_ID NUMBER NOT NULL ENABLE,
CUST_SRC_ID NUMBER,
CUST_EFF_FROM DATE,
CUST_EFF_TO DATE,
CUST_VALID VARCHAR2(1))
CLUSTER cl_sales_customers(cust_id)
其实CLUSTER就是把表加到聚簇cl_sales_customers中
三、创建聚簇索引
如果想要把数据插入到聚簇表中,必须在聚簇上创建索引
不然会报错 ORA-02032
create index idx_sales_customers on cluster cl_sales_customers
然后向聚簇表CUSTOMERS_FOR_CL和SALES_FOR_CL中插入数据
insert into CUSTOMERS_FOR_CL select t.* from CUSTOMERS t;
insert into SALES_FOR_CL select t.* from SALES t
四、删除聚簇
我们可以使用drop cluster 命令删除聚簇,但是如果聚簇中包含聚簇表,则必须包含子句including tables
drop cluster cl_sales_customers including tables;
-- including tables 表示连聚簇表一起删除
五、查看表属于哪个聚簇
查看SALES_FOR_CL 与 CUSTOMERS_FOR_CL 属于哪个聚簇
视图 user_tables all_tables 以及dba_tables 可以查看聚簇信息
SELECT t.TABLE_NAME, t.CLUSTER_NAME
FROM user_tables t
WHERE t.TABLE_NAME = 'SALES_FOR_CL'
OR t.TABLE_NAME = 'CUSTOMERS_FOR_CL';
结果如下图