Block Sizes 与多块大小表空间
Block Sizes 与多块大小表空间
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 支持数据库中同时存在多种块大小[1]:
| 块大小 | 默认 | 配置 |
|---|---|---|
| 2K | 否 | db_2k_cache_size |
| 4K | 否 | db_4k_cache_size |
| 8K | 通常默认 | db_cache_size |
| 16K | 否 | db_16k_cache_size |
| 32K | 否 | db_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. 最佳实践
- OLTP 默认 8K:标准选择
- 数据仓库用 16K/32K:大范围扫描更快
- 大对象表用大块:减少行链接
- 避免过多块大小:2-3 种为宜
- 监控各 Buffer Cache:避免浪费
- 频繁 JOIN 的表同块大小:减少切换
- TEMP 表用标准块:兼容性
- 跨平台迁移考虑块大小:源/目标一致
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