
好的,我们来对 Oracle 19C 数据库中的 V$BTS_STAT 动态性能视图进行一次全面、深入的解析。这个视图揭示了 Oracle 数据库中一项针对大规模数据处理的优化功能——Big Table Caching 的运作细节和性能统计。
1. 作用与概述
V$BTS_STAT 视图用于监控和展示与“大表缓存”(Big Table Caching)特性相关的统计信息。该特性是 Oracle 为优化决策支持系统(DSS)、数据仓库环境下的大表全表扫描(Full Table Scans, FTS)性能而设计的。
- 核心目的: 传统上,全表扫描的数据会直接进入缓冲区缓存(Buffer Cache),可能“污染”缓存,挤出那些需要频繁访问的热点数据。Big Table Caching 机制试图智能地处理这一问题。
- 工作原理: 对于被识别为“大表”的表,Oracle 在执行全表扫描时,可能会选择:
- 直接路径读取(Direct Path Read): 绕过缓冲区缓存,直接将数据从磁盘读入进程的 PGA(Program Global Area),避免冲击缓冲区缓存。
- 智能缓存: 在某些情况下(如重复扫描),Oracle 也会尝试将这些大表的数据块缓存在缓冲区缓存的一个特定区域中,
V$BTS_STAT正是监控这部分操作的。
- 视图内容: 它提供了自实例启动以来,数据库实例层面关于大表缓存操作的命中、未命中、读写量等聚合统计数据。
2. 使用场景
此视图在以下场景中非常有用:
-
数据仓库性能调优:
- 在 DSS 环境中,系统频繁执行大规模全表扫描。DBA 可以通过此视图评估 Big Table Caching 机制的有效性,判断其是否减少了物理 I/O 并提升了扫描性能。
-
评估缓存效率:
- 通过计算命中率(
HIT_COUNT / (HIT_COUNT + MISS_COUNT)),可以了解大表数据在被请求时,是已经从缓存中获取(命中),还是必须执行物理读(未命中)。
- 通过计算命中率(
-
识别“大表”候选:
- 结合
DBA_TABLES和此视图的统计信息,可以帮助识别哪些表正在或应该从 Big Table Caching 机制中受益,进而考虑是否使用ALTER TABLE ... CACHE命令来提示优化器。
- 结合
-
容量规划与监控:
- 监控
DIRECT_READ_BLOCKS和CACHED_BLOCKS可以了解系统处理大表扫描的总体数据量,为存储 I/O 和内存规划提供依据。
- 监控
3. 字段含义详解
V$BTS_STAT 视图的字段主要分为两大类:缓存访问统计和数据量统计。
| 字段名称 | 数据类型 | 含义说明 |
|---|---|---|
| HIT_COUNT | NUMBER | 大表缓存命中次数。当请求的大表数据块已经在缓存中找到时,此计数器增加。高命中率是理想状态。 |
| MISS_COUNT | NUMBER | 大表缓存未命中次数。当请求的大表数据块不在缓存中,需要从磁盘读取时,此计数器增加。 |
| DIRECT_READ_REQS | NUMBER | 发起直接路径读取(Direct Path Read)请求的次数。 |
| DIRECT_READ_BLOCKS | NUMBER | 通过直接路径读取方式读取的数据块总数。 |
| CACHED_READ_REQS | NUMBER | 发起缓存读取(即通过缓冲区缓存)请求的次数。 |
| CACHED_BLOCKS | NUMBER | 通过缓存读取方式读取的数据块总数。 |
| CON_ID | NUMBER | 所属容器的ID。在多租户环境中,标识该统计信息属于哪个PDB。 |
4. 相关视图与基表
-
相关动态性能视图:
V$SYSTEM_EVENT: 查看direct path read等待事件的总计信息。V$BTS_STAT中的DIRECT_READ_*统计与此等待事件直接相关。V$SYSSTAT: 查看诸如physical reads direct,physical reads cache等系统统计信息,可以与V$BTS_STAT的数据相互印证和补充。V$BUFFER_CACHE: 查看缓冲区缓存的整体状态。Big Table Caching 是缓冲区缓存策略的一部分。DBA_TABLES: 表的CACHE属性(CACHE/NOCACHE)会影响优化器是否考虑使用大表缓存机制。
-
基表(Underlying Base Table):
- **XKCBST∗∗:这是‘VKCBST**: 这是 `VKCBST∗∗:这是‘VBTS_STAT
所依赖的底层内存结构(基表)。KCB` 很可能代表 Kernel Cache Buffer。这个 X$ 表存储了实例级别关于缓冲区缓存和其扩展功能(如BTS)的统计计数器。 - 与其他 X$ 表一样,它是内部的、未公开的,严禁直接查询。其结构可能随版本变化。
- 视图定义查询:
SELECT view_definition FROM v$fixed_view_inition WHERE view_name = 'GV$BTS_STAT';
- **XKCBST∗∗:这是‘VKCBST**: 这是 `VKCBST∗∗:这是‘VBTS_STAT
5. 底层详细原理
-
决策过程:何时使用 Direct Path Read / Big Table Caching?
- 优化器基于成本决定是否使用直接路径读取。决策因素包括:
- 表的大小: 对象必须大于
_small_table_threshold参数值的某个倍数(通常为5倍)。这个阈值是动态的,取决于缓冲区缓存的大小。 - 缓冲区缓存的大小: 缓存越小,Oracle 越倾向于使用直接路径读取来避免“污染”缓存。
- 并行执行: 并行查询通常默认使用直接路径读取。
- 表的 CACHE 属性: 如果表被设置为
CACHE(例如ALTER TABLE big_table CACHE;),这会强烈提示优化器尝试将其数据缓存起来,即使它很大。
- 表的大小: 对象必须大于
- 这个决策是动态和智能的。即使一个表一开始被标记为使用直接路径读取,如果 Oracle 发现它被频繁访问,后续的扫描也可能会切换到缓存模式。
- 优化器基于成本决定是否使用直接路径读取。决策因素包括:
-
Big Table Caching 的工作流程:
- 阶段一:识别与直接读取: 对于符合条件的大表全表扫描,Oracle 会绕过缓冲区缓存,通过直接路径读取将数据块直接加载到服务器的 PGA 中。这个过程是异步的,可以更快地获取大量数据。
- 阶段二:智能缓存: 与此同时,Oracle 可能会可选地将这些数据块并行地加载到缓冲区缓存的某个区域。这样做的目的是:如果后续有其他查询需要访问这些相同的数据块,它们可以直接从缓冲区缓存中获取(
HIT_COUNT增加),从而避免再次昂贵的物理 I/O(MISS_COUNT减少)。 - 这种机制在避免“缓存污染”和“利用缓存加速重复访问”之间取得了平衡。
-
统计信息的收集:
- 上述所有操作(命中、未命中、直接读请求、缓存读请求)都会由数据库内核实时更新内存中的计数器(
X$KCBST)。 V$BTS_STAT视图只是对这些聚合计数器的一个简单投影(Projection),实例重启后这些计数器会被重置。
- 上述所有操作(命中、未命中、直接读请求、缓存读请求)都会由数据库内核实时更新内存中的计数器(
6. 相关知识点介绍
-
_SMALL_TABLE_THRESHOLD参数:- 这是一个关键的隐藏参数,它定义了Oracle认为的“小表”的阈值(以块为单位)。表的大小低于此阈值,全表扫描会直接进入缓冲区缓存;高于此阈值,则可能触发直接路径读取和大表缓存机制。
- 切勿轻易修改: 这是一个由Oracle自动管理的参数,通常不建议手动调整。
-
Direct Path Read vs. Buffer Cache Read:
- 优点: 直接路径读取更快(异步I/O)、更高效(绕过缓存管理开销)、不会“污染”缓冲区缓存。
- 缺点: 数据无法被其他会话共享(因为它在PGA中),并且如果同样的数据被重复访问,无法从缓存受益。
-
CACHE提示与表属性:- 在SQL中使用
/*+ CACHE */提示或为表设置CACHE属性(ALTER TABLE ... CACHE;)会强烈影响优化器的决策。这相当于告诉Oracle:“这个表虽然大,但请尽量缓存它,因为我会频繁访问它。” - 这对于中小型但非常热点的表同样有效。
- 在SQL中使用
7. 常用查询 SQL
1. 查看大表缓存的总体效率和活动量
这是最核心的查询,用于计算命中率和了解数据量。
SELECT hit_count,
miss_count,
direct_read_reqs,
direct_read_blks,
cached_read_reqs,
cached_blks,
-- 计算缓存命中率
ROUND((hit_count / NULLIF((hit_count + miss_count), 0)) * 100, 2) AS hit_ratio_percent,
-- 计算平均每次直接读的块数
ROUND(direct_read_blks / NULLIF(direct_read_reqs, 0), 2) AS avg_direct_read_size
FROM v$bts_stat;
2. 监控直接路径读取的活动
SELECT direct_read_reqs,
direct_read_blks,
ROUND(direct_read_blks / NULLIF(direct_read_reqs, 0), 2) AS avg_blocks_per_read
FROM v$bts_stat;
-- 平均读取大小过大或过小都可能值得关注
3. 比较直接读取和缓存读取的数据量
SELECT direct_read_blks,
cached_blks,
ROUND((direct_read_blks / NULLIF((direct_read_blks + cached_blks), 0)) * 100, 2) AS direct_read_percent
FROM v$bts_stat;
-- 此比值可显示系统处理大表扫描的主要方式
4. 关联系统等待事件,全面了解I/O影响
SELECT b.direct_read_blks,
e.total_waits AS direct_path_read_waits,
e.time_waited_micro / 1000000 AS direct_path_read_wait_secs
FROM v$bts_stat b
CROSS JOIN v$system_event e
WHERE e.event = 'direct path read';
-- 将读取的数据量与等待时间关联起来
总结
V$BTS_STAT 动态性能视图是洞察Oracle处理大规模数据扫描行为的“仪表盘”。它提供了传统缓冲区缓存统计之外的另一个重要视角,专门用于监控和优化大数据量、低频率但高I消耗的全表扫描操作。
通过此视图,您可以:
- 量化评估 Big Table Caching 机制在您的环境中的有效性和命中率。
- 理解模式 判断您的系统是更多地采用直接路径读取(避免缓存污染)还是智能缓存(加速重复访问)。
- 指导决策 数据可以帮助您决定是否对特定大表使用
CACHE属性,从而更好地平衡全局缓存效率与特定查询性能。
掌握这个视图,意味着您对Oracle的内存管理和I/O处理机制有了更深层次的理解,能够更好地优化数据仓库和决策支持系统类型的负载。它与 V$SYSTEM_EVENT、V$SYSSTAT 等视图结合使用,可以构建出完整的I/O性能分析图谱。
欢迎关注我的公众号《IT小Chen》
950

被折叠的 条评论
为什么被折叠?



