Block Sizes 与多块大小表空间

Block Sizes 与多块大小表空间

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 支持数据库中同时存在多种块大小[1]:

块大小默认配置
2Kdb_2k_cache_size
4Kdb_4k_cache_size
8K通常默认db_cache_size
16Kdb_16k_cache_size
32Kdb_32k_cache_size

2. 标准块与非标准块

2.1 标准块

-- 查看标准块大小
SHOW PARAMETER db_block_size;
-- 默认 8K(8192 字节)

-- 标准块对应 Buffer Cache
SHOW PARAMETER db_cache_size;

2.2 非标准块

需独立配置 Buffer Cache:

-- 启用 16K 块缓存
ALTER SYSTEM SET db_16k_cache_size=512M SCOPE=BOTH;

-- 启用 32K 块缓存
ALTER SYSTEM SET db_32k_cache_size=1G SCOPE=BOTH;

-- 查看所有块缓存
SELECT name, value/1024/1024 AS mb 
FROM v$parameter 
WHERE name LIKE 'db_%_cache_size' 
ORDER BY name;

3. 创建非标准块表空间

3.1 创建前确认

-- 必须先配置对应块大小的 Buffer Cache
ALTER SYSTEM SET db_16k_cache_size=512M SCOPE=BOTH;

3.2 创建表空间

-- 16K 块表空间
CREATE TABLESPACE ts_16k 
  DATAFILE '/u01/ts16k_01.dbf' SIZE 1G
  BLOCKSIZE 16K;

-- 32K 块表空间
CREATE TABLESPACE ts_32k 
  DATAFILE '/u01/ts32k_01.dbf' SIZE 1G
  BLOCKSIZE 32K;

-- 验证
SELECT 
  tablespace_name, 
  block_size, 
  status
FROM dba_tablespaces
WHERE block_size <> 8192;

4. 块大小选择策略

4.1 OLTP(在线事务处理)

推荐 8K

  • 行级操作多
  • Buffer Cache 命中率高
  • I/O 开销小

4.2 数据仓库(DSS)

推荐 16K / 32K

  • 大范围扫描
  • 减少块头开销
  • 提升全表扫描性能
  • 单块存储更多行

4.3 大对象表

推荐 16K / 32K

  • 减少行链接
  • 提升大行存储效率

4.4 索引

推荐 8K 或更大

  • 大块减少索引层数
  • 提升索引扫描性能

5. 块大小与性能

5.1 I/O 性能

8K 块,1GB 数据:
- 131,072 个块
- 多块读 db_file_multiblock_read_count=16
- 单次 I/O: 8K * 16 = 128K

16K 块,1GB 数据:
- 65,536 个块(少一半)
- 单次 I/O: 16K * 16 = 256K(更大)
→ 单次 I/O 数据量翻倍

5.2 Buffer Cache 命中率

  • 小块(8K):缓存命中率高,热数据更精细
  • 大块(32K):单块含更多行,但可能浪费缓存

5.3 行迁移/链接

  • 小块:易出现行迁移
  • 大块:行链接减少,适合大行表

6. 多块大小表空间的应用场景

6.1 OLTP + DW 混合

-- OLTP 业务表:8K
CREATE TABLESPACE ts_oltp DATAFILE '/u01/oltp.dbf' SIZE 1G;

-- 报表/分析表:16K
CREATE TABLESPACE ts_dss DATAFILE '/u01/dss.dbf' SIZE 1G BLOCKSIZE 16K;

6.2 大对象表

-- 含大 LOB 的表
CREATE TABLE docs (
  id NUMBER,
  content CLOB,
  metadata CLOB
) TABLESPACE ts_16k;

6.3 跨平台迁移

不同平台默认块大小可能不同,多块大小支持便于迁移:

-- 跨平台 transportable tablespace
-- 源平台默认 2K,目标平台默认 8K
-- 可保留源块大小

7. 限制与注意事项

7.1 限制

  • 数据库标准块不可修改:建库后 db_block_size 固定
  • SYSTEM 表空间用标准块:不可改
  • TEMP 表空间:建议与标准块一致
  • 每个块大小需独立 Buffer Cache

7.2 注意事项

  • Buffer Cache 总和需合理控制
  • 跨表空间 JOIN 可能影响性能
  • 监控各 Buffer Cache 使用率

8. 监控

-- 各 Buffer Pool 命中率
SELECT 
  name, 
  block_size,
  target_size/1024/1024 AS mb,
  1 - (physical_reads / NULLIF(db_block_gets + consistent_gets, 0)) AS hit_ratio
FROM v$buffer_pool_statistics;

-- 各表空间块大小
SELECT 
  tablespace_name,
  block_size,
  status,
  contents
FROM dba_tablespaces
ORDER BY block_size;

-- 各 Buffer Cache 使用
SELECT 
  name,
  block_size,
  current_size/1024/1024 AS mb,
  buffers
FROM v$buffer_pool;

9. 常见坑与排错

9.1 ORA-29339: tablespace block size not supported

现象:创建非标准块表空间报错。

原因:未配置对应块大小的 Buffer Cache。

修复

ALTER SYSTEM SET db_16k_cache_size=512M SCOPE=BOTH;

-- 然后再创建
CREATE TABLESPACE ts_16k DATAFILE '/u01/ts16k.dbf' SIZE 1G BLOCKSIZE 16K;

9.2 Buffer Cache 配置不当

现象:某块大小 Buffer Cache 过大或过小。

修复

-- 监控各 Buffer Cache 命中率
SELECT 
  name, 
  block_size, 
  current_size/1024/1024 AS mb
FROM v$buffer_pool;

-- 调整
ALTER SYSTEM SET db_16k_cache_size=1G SCOPE=BOTH;

9.3 跨表空间 JOIN 性能差

现象:不同块大小表空间 JOIN 慢。

原因:Buffer Cache 不共享,频繁切换。

修复

  • 将频繁 JOIN 的表放同一块大小表空间
  • 使用相同块大小

9.4 SGA 空间紧张

现象:多个 Buffer Cache 配置过多,SGA 不够。

修复

-- 增大 SGA
ALTER SYSTEM SET sga_target=16G SCOPE=BOTH;

-- 或减少某些 Buffer Cache
ALTER SYSTEM SET db_32k_cache_size=0 SCOPE=BOTH;

10. 最佳实践

  1. OLTP 默认 8K:标准选择
  2. 数据仓库用 16K/32K:大范围扫描更快
  3. 大对象表用大块:减少行链接
  4. 避免过多块大小:2-3 种为宜
  5. 监控各 Buffer Cache:避免浪费
  6. 频繁 JOIN 的表同块大小:减少切换
  7. TEMP 表用标准块:兼容性
  8. 跨平台迁移考虑块大小:源/目标一致

11. 参考资料

[1] Oracle Database Concepts 19c, “Data Blocks” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/logical-storage-structures.html

[2] Oracle Database Administrator’s Guide 19c, “Multiple Block Sizes” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-tablespaces.html