Oracle Database 23cで表やビューの最大列数が4096列になったので試してみた

# はじめに

Oracle Databaseではこれまで表やビューの最大列数が1000でしたが、Oracle Database 23cから最大4096列に拡張されました。

ということで、早速試してみました。

（ちなみに最大列数が1000になったのはOracle 8からで、Oracle 7.3までは最大列数が255でした。最大列数を1000に引き上げる際に少し関わっていたので、よく覚えています。）

# 1. 列数が4096の表の作成（1）
Oracle Database 23c Free - Developer Releaseをインストール後のデフォルトの状態で、列数が4096の表tbl4096を以下のようなDDLで作成してみます。

```
SQL> CREATE TABLE tbl4096 (
  2    col1    number,
  3    col2    number,
  4    col3    number,
  5    col4    number,
  6    col5    number,
  7    col6    number,
  8    col7    number,
  9    col8    number,
＜中略＞
4089    col4088 number,
4090    col4089 number,
4091    col4090 number,
4092    col4091 number,
4093    col4092 number,
4094    col4093 number,
4095    col4094 number,
4096    col4095 number,
4097    col4096 number);
        col1001 number,
        *
ERROR at line 1002:
ORA-01792: maximum number of columns in a table or view is 1000


SQL>
```
おっと、表の最大列数は1000までというエラーになりました。
これは、Oracle Database 23cでもデフォルトの設定では表の最大列数が1000になっているためです。

# 2. 初期化パラメータの変更（1）

表の最大列数を4096列に変更するには、初期化パラメータmax_columnsを変更します。

デフォルトでは、max_columnsの値は「STANDARD」になっています。
これは表の最大列数が、従来通りの1000であることを意味します。
```
SQL> show parameter max_columns

NAME				                 TYPE	     VALUE
------------------------------------ ----------- ------------------------------
max_columns			                 string	     STANDARD
SQL> 
```
また、表の最大列数を4096に変更するには、初期化パラメータcompatibleが23.0.0.0以上である必要があります。
念の為、compatibleの値を確認します。
```
SQL> show parameter compatible

NAME				                 TYPE	     VALUE
------------------------------------ ----------- ------------------------------
compatible			                 string	     23.0.0
noncdb_compatible		             boolean	 FALSE
SQL> 
```
compatibleが23.0.0ですので、このままで表の最大列数を変更できることが確認できました。

表の最大列数を4096にするには、ALTER SYSTEM文でmax_columnsを「EXTENDED」に設定します。
max_columnsは動的に変更できないため、SCOPEにspfileを指定してALTER SYSTEM文を実行し、PDBを再起動します。
```
SQL> ALTER SYSTEM SET max_columns = EXTENDED SCOPE=spfile;

System altered.

SQL>
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
SQL> 
```
max_columnsの値がEXTENDEDに変更されていることを確認します。
```
SQL> show parameter max_columns

NAME				                 TYPE	     VALUE
------------------------------------ ----------- ------------------------------
max_columns			                 string	     EXTENDED
SQL>
```
# 3.  列数が4096の表の作成（2）

再度、列数が4096の表を作成してみます。
```
SQL> CREATE TABLE tbl4096 (
  2    col1    number,
  3    col2    number,
  4    col3    number,
  5    col4    number,
  6    col5    number,
  7    col6    number,
  8    col7    number,
  9    col8    number,
＜中略＞
4089    col4088 number,
4090    col4089 number,
4091    col4090 number,
4092    col4091 number,
4093    col4092 number,
4094    col4093 number,
4095    col4094 number,
4096    col4095 number,
4097    col4096 number);

Table created.

SQL>
```
今度は問題なく作成できました。

# 4. 列数が4096の表へのデータのINSERT
表が作成できたので、データをINSERTしてみます。
```
SQL> INSERT INTO tbl4096 VALUES (
  2  1,
  3  2,
  4  3,
  5  4,
  6  5,
  7  6,
  8  7,
  9  8,
 10  9,
＜中略＞
4089  4088,
4090  4089,
4091  4090,
4092  4091,
4093  4092,
4094  4093,
4095  4094,
4096  4095,
4097  4096);

1 row created.

SQL>
```
問題なくデータをINSERTできました。

# 2. 初期化パラメータの変更（2）

4096列を持つ表がある状態で、ALTER SYSTEM文でmax_columnsを「STANDARD」に戻してみます。
```
SQL> ALTER SYSTEM SET max_columns=STANDARD SCOPE=spfile; 
ALTER SYSTEM SET max_columns=STANDARD SCOPE=spfile
*
ERROR at line 1:
ORA-32017: failure in updating SPFILE
ORA-60471: max_columns can not be set to STANDARD as there are one or more
objects with more than 1000 columns


SQL> 
```
データベース内に列数が1000を超えるオブジェクトがあるためSTANDARDに変更できないというエラーが発生しました。

4096列を持つ表を削除します。
```
SQL> DROP TABLE tbl4096;

Table dropped.

SQL>
```
再度、ALTER SYSTEM文でmax_columnsを「STANDARD」に戻してみます。
```
SQL> ALTER SYSTEM SET max_columns=STANDARD SCOPE=spfile;

System altered.

SQL>
```
問題なく変更ができ、表の最大列数が1000に戻りました。

# 参考情報
・[Oracle Database 23c New Features：Increase Column Limit](https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/oltp-and-core-database.html#GUID-093BB4CA-611A-407B-8A56-E84C352FB6AD)
・[Oracle Database 23c Database Reference：MAX_COLUMNS](https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/MAX_COLUMNS.html#GUID-916B35D1-364E-41C6-A025-E2D32533D08E)