Oracle 23c에 오브젝트의 메타데이터를 관리할 수 있는 어노테이션 (Annotation) 기능이 추가되었습니다.
Annotations enable you to store and retrieve metadata about database objects. These are name-value pairs or simply a name. These are freeform text fields applications can use to customize business logic or user interfaces. Annotations help you use database objects in the same way across all applications. This simplifies development and improves data quality.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다. ANNOTATIONS 절로 테이블과 칼럼에 대한 어노테이션을 생성합니다. 어노테이션은 key-value 또는 key only 형식으로 저장할 수 있습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (
c1 NUMBER ANNOTATIONS (name 'Column 1')
, c2 NUMBER ANNOTATIONS (name 'Column 2', system)
) ANNOTATIONS (name 'Table 1', type 'Test');
*_ANNOTATIONS, *_ANNOTATIONS_USAGE 뷰에서 어노테이션 정보를 조회할 수 있습니다.
-- 2-1
SELECT * FROM user_annotations;
ANNOTATION_NAME
---------------
NAME
TYPE
SYSTEM
3 행이 선택되었습니다.
-- 2-2
SELECT * FROM user_annotations_usage WHERE object_name = 'T1';
OBJECT_NAME OBJECT_TYPE COLUMN_NAME DOMAIN_NAME DOMAIN_OWNER ANNOTATION_NAME ANNOTATION_VALUE
----------- ----------- ----------- ----------- ------------ --------------- ----------------
T1 TABLE NAME Table 1
T1 TABLE TYPE Type 1
T1 TABLE C1 NAME Column 1
T1 TABLE C2 NAME Column 2
T1 TABLE C2 SYSTEM
5 행이 선택되었습니다.
커서 무효화를 테스트하기 위해 아래 쿼리를 수행하겠습니다.
-- 3-1
SELECT /* TEST1 */ * FROM t1;
선택된 레코드가 없습니다.
-- 3-2
SELECT loads, invalidations, executions FROM v$sql WHERE sql_text = 'SELECT /* TEST1 */ * FROM t1';
LOADS INVALIDATIONS EXECUTIONS
----- ------------- ----------
1 0 1
1개의 행이 선택되었습니다.
어노테이션은 DROP 또는 ADD할 수 있으며, 어노테이션을 변경하기 위해서는 DROP 후 ADD하는 방식을 사용해야 합니다.
-- 4-1
ALTER TABLE t1 ANNOTATIONS (DROP type, ADD type 'Type 2');
-- 4-2
ALTER TABLE t1 MODIFY (c2 ANNOTATIONS (DROP system, ADD system 'True'));
*_ANNOTATIONS_USAGE 뷰를 조회하면 어노테이션이 변경된 것을 확인할 수 있습니다.
-- 5
SELECT * FROM user_annotations_usage WHERE object_name = 'T1';
OBJECT_NAME OBJECT_TYPE COLUMN_NAME DOMAIN_NAME DOMAIN_OWNER ANNOTATION_NAME ANNOTATION_VALUE
----------- ----------- ----------- ----------- ------------ --------------- ---------------
T1 TABLE NAME Table 1
T1 TABLE TYPE Type 2
T1 TABLE C1 NAME Column 1
T1 TABLE C2 NAME Column 2
T1 TABLE C2 SYSTEM True
5 행이 선택되었습니다.
커서 무효화 테스트 쿼리를 다시 수행하면 커서가 무효화된 것을 확인할 수 있습니다. 어노테이션은 파싱과 무관하므로 향후 Fine-Grained Cursor Invalidation 기능에 어노테이션이 추가되어야 할 것으로 보입니다.
-- 6-1
SELECT /* TEST1 */ * FROM t1;
선택된 레코드가 없습니다.
-- 6-2
SELECT loads, invalidations, executions FROM v$sql WHERE sql_text = 'SELECT /* TEST1 */ * FROM t1';
LOADS INVALIDATIONS EXECUTIONS
----- ------------- ----------
2 1 1
1개의 행이 선택되었습니다.
참고로 COMMENT 문은 커서를 무효화시키지 않습니다.
-- 7-1
SELECT /* TEST2 */ * FROM t1;
선택된 레코드가 없습니다.
-- 7-2
SELECT loads, invalidations, executions FROM v$sql WHERE sql_text = 'SELECT /* TEST2 */ * FROM t1';
LOADS INVALIDATIONS EXECUTIONS
----- ------------- ----------
1 0 1
1개의 행이 선택되었습니다.
-- 7-3
COMMENT ON TABLE t1 IS 'Table 1';
주석이 생성되었습니다.
-- 7-4
SELECT /* TEST2 */ * FROM t1;
선택된 레코드가 없습니다.
-- 7-5
SELECT loads, invalidations, executions FROM v$sql WHERE sql_text = 'SELECT /* TEST2 */ * FROM t1';
LOADS INVALIDATIONS EXECUTIONS
----- ------------- ----------
1 0 2
1개의 행이 선택되었습니다.