ORACLE ---- 和PostgreSQL继承表类似的实现方式
Posted Scott
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE ---- 和PostgreSQL继承表类似的实现方式相关的知识,希望对你有一定的参考价值。
昨天介绍了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是怎样应用的。
--做成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的两张表确实共享了存储空间。
当然,ORACLE数据库的CLUSTER和PostgreSQL继承表并不是相同的东西,上面的例子只是从多张表共享物理存储空间的角度进行了分析,至于其他的角度,就见仁见智了。
2021/06/18 @ Dalian
以上是关于ORACLE ---- 和PostgreSQL继承表类似的实现方式的主要内容,如果未能解决你的问题,请参考以下文章
如何使 BLOB 在 Oracle 和 PostgreSQL 上工作?
PostgreSQL 和 Oracle 对象关系存储是不是与 ORM 相同?