昨天介紹了PostgreSQL裏的繼承表,今天來繼續討論ORACLE數據庫裏有沒有相似的東西。數據庫
首先,能夠明確的說,ORACLE數據庫裏沒有繼承表這種OBJECT。
可是,和PostgreSQL的繼承表相似,不一樣Table的數據以某種方式進行關聯,共享存儲空間的角度來說,ORACLE數據庫也存在這樣的OBJECT。oracle
那就是CLUSTER。code
首先,ORACLE數據庫對「CLUSTER」是這樣定義的:繼承
CREATE CLUSTER (oracle.com) A cluster is a schema object that contains data from one or more tables.
下面咱們來看看CLUSTER是怎樣應用的。索引
--作成CLUSTER SQL> conn test/test@localhost:1521/pdb 接続されました。 SQL> CREATE CLUSTER object (object VARCHAR2(23)) SIZE 512 STORAGE (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(*) ---------- 2898 SQL> select count(*) from object_table; COUNT(*) ---------- 2223 SQL> @obj object_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 TABLE SQL> @obj object_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 TABLE SQL> @ddl object_typeに値を入力してください: TABLE object_nameに値を入力してください: OBJECT_INDEX ownerに値を入力してください: 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 dual DBMS_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> @ddl object_typeに値を入力してください: TABLE object_nameに値を入力してください: OBJECT_TABLE ownerに値を入力してください: 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 dual DBMS_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 a10 col SEGMENT_NAME for a20 col SEGMENT_TYPE for a18 col SEGMENT_SUBTYPE for a10 col TABLESPACE_NAME for a10 col RETENTION for a7 set lin 200 pages 999 select 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 12 TEST IDX_OBJECT INDEX ASSM USERS 12 146 8 1
OK,已經能夠確認到使用CLUSTER的兩張表確實共享了存儲空間。get
固然,ORACLE數據庫的CLUSTER和PostgreSQL繼承表並非相同的東西,上面的例子只是從多張表共享物理存儲空間的角度進行了分析,至於其餘的角度,就見仁見智了。it
2021/06/18 @ Daliantable