Materialized Expression Columns

2025. 6. 8.·Oracle/Administration

Oracle 23ai(23.7)에 Materialized Expression Columns 기능이 추가되었습니다. Materialized Expression Column은 물리적으로 값이 저장되는 Virtual Column입니다. 기능이 추가되면서 Virtual Column을 Expression Column으로 명칭을 변경하고 기존의 Virtual Column을 Virtual Expression Column, 추가된 기능을 Materialized Expression Column으로 명명한 것으로 보입니다.

 

아래는 virtual_column_definition 절의 구문입니다. 칼럼 표현식 뒤에 VIRTUAL 또는 MATERIALIZED 키워드를 사용할 수 있습니다.

column [datatype] [ VISIBLE | INVISIBLE ] [GENERATED ALWAYS] AS (column_expression) [ VIRTUAL | MATERIALIZED ]

 

테스트를 위해 아래와 같이 테이블을 생성하겠습니다. c2 칼럼은 Virtual Expression Column, c3 칼럼은 Materialized Expression Column으로 생성됩니다.

-- 1
DROP TABLE t1 PURGE;

CREATE TABLE t1 (
    c1 NUMBER
  , c2 NUMBER AS (c1 + 1)
  , c3 NUMBER AS (c1 + 2) MATERIALIZED
);

 

아래는 *_TAB_COLS 뷰를 조회한 결과입니다. 현재까지 Materialized Expression Column을 구분할 수 있는 칼럼이 추가되지 않은 것으로 보입니다. data_default_vc IS NOT NULL AND virtual_column = 'NO' 조건으로 Materialized Expression Column을 식별할 수 있습니다.

-- 2
SELECT column_name, column_id, data_default_vc, virtual_column, segment_column_id
  FROM user_tab_cols
 WHERE table_name = 'T1';

COLUMN_NAM COLUMN_ID DATA_DEFAULT_VC VIRTUAL_COLUMN SEGMENT_COLUMN_ID
---------- --------- --------------- -------------- -----------------
C1                 1                 NO                             1
C2                 2 "C1"+1          YES
C3                 3 "C1"+2          NO                             2

3 rows selected.

 

아래와 같이 INSERT 문을 수행하겠습니다. Virtual Expression Column와 Materialized Expression Column 모두 데이터를 삽입할 수 없습니다.

-- 3-1
INSERT INTO t1 (c1) VALUES (1);

1 row created.

INSERT INTO t1 (c2) VALUES (2);

ORA-54013: INSERT operation disallowed on virtual columns

INSERT INTO t1 (c3) VALUES (3);

ORA-54013: INSERT operation disallowed on virtual columns

COMMIT;

-- 3-2
SELECT * FROM t1;

C1 C2 C3
-- -- --
 1  2  3

1 row selected.

 

아래는 블록 덤프 결과입니다. c1, c3 칼럼만 값이 저장된 것을 볼 수 있습니다.

block_row_dump:
tab 0, row 0, @0x1f8f
tl: 9 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 2]  c1 04
end_of_block_dump

 

아래와 같이 UPDATE 문을 수행하겠습니다. c2, c3 값이 변경된 것을 볼 수 있습니다.

-- 3-1
UPDATE t1 SET c1 = 2;

-- 3-2
SELECT * FROM t1;

C1 C2 C3
-- -- --
 2  3  4

1 row selected.

 

Virtual Expression Column과 Materialized Expression Column 모두 인덱스를 생성할 수 있습니다.

-- 4-1
CREATE INDEX t1_x2 ON t1 (c2);

Index created.

-- 4-2
CREATE INDEX t1_x3 ON t1 (c3);

Index created.
저작자표시 비영리 변경금지 (새창열림)
'Oracle/Administration' 카테고리의 다른 글
  • OATS (Object Activity Tracking System)
  • Staging Table
  • ALTER SYSTEM FLUSH LOCAL
  • ALTER TABLE MOVE 개선
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (206)
      • Oracle (177)
        • SQL (36)
        • PLSQL (10)
        • Performance (75)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7)
      • Exadata (16)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
Materialized Expression Columns
상단으로

티스토리툴바