Oracle 23ai에 Staging Table 기능이 추가되었습니다. 적재 성능을 개선하기 위해 로깅 최소화 등의 기능이 추가되기를 바랬지만 현재까지는 압축, 통계 수집, 파티션 관리가 불가능하고 삭제시 즉시 PURGE되는 점을 제외하면 일반 테이블과 크게 다르지 않은 것 같습니다.
Staging tables are heap tables optimized for fast data ingestion and for handling volatile data. Key table attributes are set to defaults for these use cases without any additional user interaction. Creating staging tables rather than 'normal' tables saves you time and effort so that you do not need to tune your table attributes for fast data ingestion with volatile data content. A staging table is configured by default with optimal configuration settings in order to guarantee the best possible performance and to avoid unnecessary performance debugging and tuning.
테스트 버전은 아래와 같습니다.
-- 1
SELECT version_full FROM product_component_version;
VERSION_FULL
------------
23.4.0.24.05
1 row selected.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다. CREATE TABLE 문에 FOR STAGING 절을 사용하면 Staging 테이블이 생성됩니다. COMPRESS 절은 테스트를 위해 추가했습니다.
-- 2
DROP TABLE t1_n PURGE;
DROP TABLE t1_s PURGE;
CREATE TABLE t1_n (c1 NUMBER) COMPRESS;
CREATE TABLE t1_s (c1 NUMBER) FOR STAGING COMPRESS;
*_TABLES 뷰에서 Staging 테이블이 압축이 불가능하고 staging 값이 YES로 표시된다는 점을 제외하면 일반 테이블과 동일한 기본 속성을 가지고 있음을 알 수 있습니다. 아울러 *_TAB_STATISTICS 뷰의 stattype_locked 값에서 통계 수집이 잠겨 있는 것을 확인할 수 있습니다.
-- 3-1
SELECT table_name, pct_free, ini_trans, max_trans, logging, compression, staging
FROM user_tables
WHERE table_name IN ('T1_N', 'T1_S');
TABLE_NAME PCT_FREE INI_TRANS MAX_TRANS LOGGING COMPRESSION STAGING
---------- -------- --------- --------- ------- ----------- -------
T1_N 10 1 255 YES ENABLED NO
T1_S 10 1 255 YES DISABLED YES
2 rows selected.
-- 3-2
SELECT table_name, stattype_locked
FROM user_tab_statistics
WHERE table_name IN ('T1_N', 'T1_S');
TABLE_NAME STATTYPE_LOCKED
---------- ---------------
T1_N
T1_S ALL
2 rows selected.
이후 테스트를 위해 t1_n 테이블의 압축을 비활성화하겠습니다. ALTER TABLE 문으로 Staging 테이블인 t1_s 테이블에 압축을 설정하면 ORA-38500 에러가 발생합니다.
-- 4-1
ALTER TABLE t1_n NOCOMPRESS;
Table altered.
-- 4-2
ALTER TABLE t1_s COMPRESS;
ORA-38500: Invalid operation on Staging TABLE
아래와 같이 두 테이블에 데이터를 삽입하겠습니다.
-- 5-1
INSERT /*+ APPEND */ INTO t1_n SELECT ROWNUM FROM XMLTABLE ('1 to 1000000');
COMMIT;
-- 5-2
INSERT /*+ APPEND */ INTO t1_s SELECT ROWNUM FROM XMLTABLE ('1 to 1000000');
COMMIT;
*_TAB_STATISTICS 뷰에서 Staging 테이블인 t1_s 테이블은 통계가 수집되지 않은 것과 *_SEGMENT 뷰에서 두 세그먼트의 크기가 동일한 것을 확인할 수 있습니다.
-- 6-1
SELECT table_name, num_rows, blocks, stattype_locked
FROM user_tab_statistics
WHERE table_name IN ('T1_N', 'T1_S');
TABLE_NAME NUM_ROWS BLOCKS STATTYPE_LOCKED
---------- -------- ------ ---------------
T1_N 1000000 1408
T1_S ALL
2 rows selected.
-- 6-2
SELECT segment_name, bytes, blocks, extents
FROM user_segments
WHERE segment_name IN ('T1_N', 'T1_S');
SEGMENT_NAME BYTES BLOCKS EXTENTS
------------ -------- ------ -------
T1_N 11534336 1408 26
T1_S 11534336 1408 26
2 rows selected.
Staging 테이블도 강제로 통계를 수집할 수 있습니다.
-- 7-1
EXEC DBMS_STATS.GATHER_TABLE_STATS (NULL, 'T1_S', force => TRUE);
-- 7-2
SELECT table_name, num_rows, blocks, stattype_locked
FROM user_tab_statistics
WHERE table_name IN ('T1_N', 'T1_S');
TABLE_NAME NUM_ROWS BLOCKS STATTYPE_LOCKED
---------- -------- ------ ---------------
T1_N 1000000 1408
T1_S 1000000 1408 ALL
2 rows selected.
아래와 같이 두 테이블을 삭제하면 Staging 테이블인 t1_s 테이블이 즉시 PURGE됩니다.
-- 8-1
DROP TABLE t1_n;
DROP TABLE t1_s;
-- 8-2
SELECT object_name, original_name
FROM user_recyclebin
WHERE original_name IN ('T1_N', 'T1_S');
OBJECT_NAME ORIGINAL_NAME
------------------------------ -------------
BIN$Hk4c0Pm5E0ngYwEAAH/KVA==$0 T1_N
1 row selected.
-- 8-3
PURGE TABLE t1_n;
관련 링크