프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai 뉴피처 테이블 최대 컬럼 갯수 증가

오라클 23ai 부터 테이블당 추가 가능한 최대 컬럼 갯수가 1000개에서 4096개로 증가됨
이 기능은 기본적으로 비활성화 되어 있고 MAX_COLUMNS 파라미터를 EXTENDED 로 변경 했을때만 4096개의 컬럼을 사용할 수 있음
이 기능이 생기게 된 계기는 머신러닝 및 IoT 애플리케이션 업무 같은 일부 애플리케이션에서 1000개 이상의 컬럼을 사용하는 비정규화된 테이블을 사용해야 할 수 있기 때문에 생겼다고함
테스트로 4096개 컬럼이 추가되는지 확인해봄

 

 

테스트
현재 max_columns 파라미터 확인

1
2
3
4
5
SQL> show parameter max_columns
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_columns                          string      STANDARD

현재 STANDARD 임

 

 

컬럼 1000개인 테이블을 만드는 plsql 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL>
DECLARE
    v_sql CLOB;
BEGIN
    v_sql := 'CREATE TABLE large_table (';
 
    FOR i IN 1..1000 LOOP
        v_sql := v_sql || 'col' || TO_CHAR(i) || ' NUMBER';
        IF i != 1000 THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;
 
    v_sql := v_sql || ')';
 
    EXECUTE IMMEDIATE v_sql;
END;
/
 
PL/SQL procedure successfully completed.

정상적으로 생성됨

 

 

컬럼 갯수 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> 
set lines 200 pages 1000
col table_name for a15
select table_name, count(*) 
from dba_tab_cols
where table_name = 'LARGE_TABLE'
group by table_name;
 
TABLE_NAME        COUNT(*)
--------------- ----------
LARGE_TABLE           1000

컬럼이 1000개인 테이블이 정상적으로 생성됨

 

 

컬럼이 1001개인 테이블 생성 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL>
DECLARE
    v_sql CLOB;
BEGIN
    v_sql := 'CREATE TABLE large_table2 (';
 
    FOR i IN 1..1001 LOOP
        v_sql := v_sql || 'col' || TO_CHAR(i) || ' NUMBER';
        IF i != 1001 THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;
 
    v_sql := v_sql || ')';
 
    EXECUTE IMMEDIATE v_sql;
END;
/
*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000
ORA-06512: at line 15
Help: https://docs.oracle.com/error-help/db/ora-01792/

ORA-01792 에러가 발생함

 

 

max_columns 파라미터 extended 로 변경

1
2
3
SQL> alter system set max_columns = extended scope = spfile;
 
System altered.

 

 

pdb 재기동

1
2
3
4
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.

 

 

max_columns 파라미터 확인

1
2
3
4
5
SQL> show parameter max_columns
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_columns                          string      EXTENDED

max_columns 값이 EXTENDED로 변경됨, 이제 4096개 컬럼을 가질 수 있음

 

 

4096개 컬럼을 가진 테이블 생성 시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL>
DECLARE
    v_sql CLOB;
BEGIN
    v_sql := 'CREATE TABLE vlarge_table (';
 
    FOR i IN 1..4096 LOOP
        v_sql := v_sql || 'col' || TO_CHAR(i) || ' NUMBER';
        IF i != 4096 THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;
 
    v_sql := v_sql || ')';
 
    EXECUTE IMMEDIATE v_sql;
END;
/
 
PL/SQL procedure successfully completed.

정상적으로 생성됨

 

 

컬럼 갯수 확인

1
2
3
4
5
6
7
8
9
10
11
SQL> 
set lines 200 pages 1000
col table_name for a15
select table_name, count(*) 
from dba_tab_cols
where table_name = 'VLARGE_TABLE'
group by table_name;
 
TABLE_NAME        COUNT(*)
--------------- ----------
VLARGE_TABLE          4096

컬럼이 4096개인 테이블이 정상적으로 생성됨

 

 

마찬가지로 4097개 컬럼을 가진 테이블을 생성하려하면 에러가 발생함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL>
DECLARE
    v_sql CLOB;
BEGIN
    v_sql := 'CREATE TABLE vlarge_table2 (';
 
    FOR i IN 1..4097 LOOP
        v_sql := v_sql || 'col' || TO_CHAR(i) || ' NUMBER';
        IF i != 4097 THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;
 
    v_sql := v_sql || ')';
 
    EXECUTE IMMEDIATE v_sql;
END;
/
*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 4096
ORA-06512: at line 15
Help: https://docs.oracle.com/error-help/db/ora-01792/

ORA-01792 에러가 발생함

 

 

참고로 pdb의 spfile 파라미터 정보는 PDB_SPFILE$에 저장됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL>
set lines 200 pages 1000
col db_uniq_name for a10
col name for a50
col value$ for a20
col sid for a20
select sid, db_uniq_name, name, value$ from pdb_spfile$;
 
SID                  DB_UNIQ_NA NAME                                               VALUE$
-------------------- ---------- -------------------------------------------------- --------------------
*                    *          max_columns                                        'EXTENDED'
FREE                 *          hybrid_read_only                                   FALSE
*                    *          spatial_vector_acceleration                        TRUE
FREE                 *          _pdb_hybrid_read_only                              FALSE

 

 

참조 : 

https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1804
https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/MAX_COLUMNS.html#REFRN-GUID-916B35D1-364E-41C6-A025-E2D32533D08E
https://tuna.tistory.com/111
2101596.1
https://oracle-base.com/articles/12c/multitenant-configure-instance-parameters-of-cdb-and-pdb-12cr1