UTFDataFormatException: encoded string too long: 66007 bytes,但同樣 SQL 在 SQL*Plus 執行無誤。核心公式:單檔最大區塊數 = 2^22 - 1 = 4,194,303 blocks (ROWID 使用 22 bits 存 block 號)。
| Block Size | 單檔上限 |
|---|---|
| 2 KB | ~ 8 GB |
| 4 KB | ~ 16 GB |
| 8 KB | ~ 32 GB |
| 16 KB | ~ 64 GB |
| 32 KB | ~ 128 GB |
實測錯誤:ORA-01144: file size (4194304 blocks) exceeds maximum 4194303 blocks。
| 方案 | 原理 | 優點 | 缺點/限制 |
|---|---|---|---|
| 1. 多資料檔 | 單表空間建多個 <32GB 檔案 | 相容所有版本、無特殊要求 | 管理檔案數增加、需監控各檔案使用率 |
| 2. 擴大 DB_BLOCK_SIZE | 建庫時指定 16K/32K,提高單檔上限 | 單檔可達 128GB (32K block) | **建庫後不可變**、大 block 可能浪費空間 (行遷移)、32 位 OS 可能不支援 32K |
| 3. Bigfile 表空間 (11g+ 推薦) | 使用 32 bits file# + 32 bits block# (共 64 bits),單檔 4G blocks | 單檔上限 **128 TB (32K block) / 32 TB (8K block)**、管理極簡化 | **一個表空間僅能含一個資料檔**、無法透過加檔擴容、需搭配 LVM/ASM 彈性擴容底層儲存 |
CREATE BIGFILE TABLESPACE big_tbs
DATAFILE '/u01/app/oracle/oradata/big_tbs01.dbf' SIZE 100G
AUTOEXTEND ON NEXT 10G MAXSIZE 32T
BLOCKSIZE 8K; -- 若資料庫預設非 8K 需指定
注意:啟用 Bigfile 後,該表空間**永遠只能有一個資料檔**,若空間耗盡僅能靠底層儲存擴容 (ASM/LVM/雲端磁碟擴容) 或 ALTER DATABASE DATAFILE ... RESIZE。