昨天介绍了PostgreSQL里的继承表,明天来持续探讨ORACLE数据库里有没有相似的货色。
首先,能够明确的说,ORACLE数据库里没有继承表这种OBJECT。
然而,和PostgreSQL的继承表相似,不同Table的数据以某种形式进行关联,共享存储空间的角度来讲,ORACLE数据库也存在这样的OBJECT。
那就是CLUSTER。
首先,ORACLE数据库对“CLUSTER”是这样定义的:
CREATE CLUSTER (oracle.com)A cluster is a schema object that contains data from one or more tables.
上面咱们来看看CLUSTER是怎么利用的。
--做成CLUSTERSQL> conn test/test@localhost:1521/pdb接続されました。SQL> CREATE CLUSTER object (object VARCHAR2(23))SIZE 512STORAGE (initial 100K next 50K); 2 3 4クラスタが作成されました。--为CLUSTR做一个索引SQL> CREATE INDEX idx_object ON CLUSTER object;索引が作成されました。--做成应用CLUSTER的第一个表SQL> CREATE TABLE object_table CLUSTER object (OBJECT_TYPE) AS SELECT * FROM dba_objects WHERE OBJECT_TYPE = 'TABLE'; 2 3表が作成されました。--做成应用CLUSTER的第二个表SQL> CREATE TABLE object_index CLUSTER object (OBJECT_TYPE) AS SELECT * FROM dba_objects WHERE OBJECT_TYPE = 'INDEX'; 2 3表が作成されました。--确认一下两个表的状态和定义SQL> select count(*) from object_index; COUNT(*)---------- 2898SQL> select count(*) from object_table; COUNT(*)---------- 2223SQL> @objobject_nameに値を入力してください: object_index旧 1: select owner,object_name,object_type from dba_objects where object_name like upper('&object_name')新 1: select owner,object_name,object_type from dba_objects where object_name like upper('object_index')OWNER OBJECT_NAME OBJECT_TYPE-------------------- -------------------------------------------------- -----------------------TEST OBJECT_INDEX TABLESQL> @objobject_nameに値を入力してください: object_table旧 1: select owner,object_name,object_type from dba_objects where object_name like upper('&object_name')新 1: select owner,object_name,object_type from dba_objects where object_name like upper('object_table')OWNER OBJECT_NAME OBJECT_TYPE-------------------- -------------------------------------------------- -----------------------TEST OBJECT_TABLE TABLESQL> @ddlobject_typeに値を入力してください: TABLEobject_nameに値を入力してください: OBJECT_INDEXownerに値を入力してください: TEST旧 1: select dbms_metadata.get_ddl('&object_type','&object_name','&owner') from dual新 1: select dbms_metadata.get_ddl('TABLE','OBJECT_INDEX','TEST') from dualDBMS_METADATA.GET_DDL('TABLE','OBJECT_INDEX','TEST')-------------------------------------------------------------------------------- CREATE TABLE "TEST"."OBJECT_INDEX" ( "OWNER" VARCHAR2(128), "OBJECT_NAME" VARCHAR2(128), "SUBOBJECT_NAME" VARCHAR2(128), "OBJECT_ID" NUMBER, "DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(23), "CREATED" DATE, "LAST_DDL_TIME" DATE, "TIMESTAMP" VARCHAR2(19), "STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1), "SECONDARY" VARCHAR2(1), "NAMESPACE" NUMBER, "EDITION_NAME" VARCHAR2(128), "SHARING" VARCHAR2(18), "EDITIONABLE" VARCHAR2(1), "ORACLE_MAINTAINED" VARCHAR2(1), "APPLICATION" VARCHAR2(1), "DEFAULT_COLLATION" VARCHAR2(100), "DUPLICATED" VARCHAR2(1), "SHARDED" VARCHAR2(1), "CREATED_APPID" NUMBER, "CREATED_VSNID" NUMBER, "MODIFIED_APPID" NUMBER, "MODIFIED_VSNID" NUMBER ) CLUSTER "TEST"."OBJECT" ("OBJECT_TYPE")SQL> @ddlobject_typeに値を入力してください: TABLEobject_nameに値を入力してください: OBJECT_TABLEownerに値を入力してください: TEST旧 1: select dbms_metadata.get_ddl('&object_type','&object_name','&owner') from dual新 1: select dbms_metadata.get_ddl('TABLE','OBJECT_TABLE','TEST') from dualDBMS_METADATA.GET_DDL('TABLE','OBJECT_TABLE','TEST')-------------------------------------------------------------------------------- CREATE TABLE "TEST"."OBJECT_TABLE" ( "OWNER" VARCHAR2(128), "OBJECT_NAME" VARCHAR2(128), "SUBOBJECT_NAME" VARCHAR2(128), "OBJECT_ID" NUMBER, "DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(23), "CREATED" DATE, "LAST_DDL_TIME" DATE, "TIMESTAMP" VARCHAR2(19), "STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1), "SECONDARY" VARCHAR2(1), "NAMESPACE" NUMBER, "EDITION_NAME" VARCHAR2(128), "SHARING" VARCHAR2(18), "EDITIONABLE" VARCHAR2(1), "ORACLE_MAINTAINED" VARCHAR2(1), "APPLICATION" VARCHAR2(1), "DEFAULT_COLLATION" VARCHAR2(100), "DUPLICATED" VARCHAR2(1), "SHARDED" VARCHAR2(1), "CREATED_APPID" NUMBER, "CREATED_VSNID" NUMBER, "MODIFIED_APPID" NUMBER, "MODIFIED_VSNID" NUMBER ) CLUSTER "TEST"."OBJECT" ("OBJECT_TYPE")--确认一下两个表的存储状况col OWNER for a10col SEGMENT_NAME for a20col SEGMENT_TYPE for a18col SEGMENT_SUBTYPE for a10col TABLESPACE_NAME for a10col RETENTION for a7set lin 200 pages 999select OWNER,SEGMENT_NAME,SEGMENT_TYPE,SEGMENT_SUBTYPE,TABLESPACE_NAME,HEADER_FILE,HEADER_BLOCK,BLOCKS,EXTENTS,RETENTION from dba_segments where OWNER='TEST';OWNER SEGMENT_NAME SEGMENT_TYPE SEGMENT_SU TABLESPACE HEADER_FILE HEADER_BLOCK BLOCKS EXTENTS RETENTI---------- -------------------- ------------------ ---------- ---------- ----------- ------------ ---------- ---------- -------TEST OBJECT CLUSTER ASSM USERS 12 130 96 12TEST IDX_OBJECT INDEX ASSM USERS 12 146 8 1
OK,曾经能够确认到应用CLUSTER的两张表的确共享了存储空间。
当然,ORACLE数据库的CLUSTER和PostgreSQL继承表并不是雷同的货色,下面的例子只是从多张表共享物理存储空间的角度进行了剖析,至于其余的角度,就见仁见智了。
2021/06/18 @ Dalian