ORACLE -- PostgreSQL 상속표와 유사한 실현 방식

6777 단어
어제는 PostgreSQL의 상속표를 소개했고, 오늘은 Oracle 데이터베이스에 유사한 것이 있는지 계속 토론하겠습니다.
우선 ORACLE 데이터베이스에는 상속표 같은 OBJECT가 없다는 것을 명확히 할 수 있다.그러나 PostgreSQL의 계승표와 유사하고 서로 다른 테이블의 데이터가 어떤 방식으로 연결되며 공유 저장 공간의 측면에서 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

좋은 웹페이지 즐겨찾기