面试宝典:介绍下Oracle数据库动态性能视图 V$SYS_OPTIMIZER_ENV

在这里插入图片描述

理解您想深入了解 Oracle 19C 数据库中 V$SYS_OPTIMIZER_ENV 动态性能视图。作为数据库管理员或开发人员,掌握这个视图对于理解和调优 SQL 执行计划至关重要。我会为您详细梳理这个视图的各个方面。

📊 Oracle 19C V$SYS_OPTIMIZER_ENV 详解

1 视图概述与核心作用

V$SYS_OPTIMIZER_ENV 是 Oracle 数据库中的一个重要动态性能视图,它提供了当前数据库实例级别所有优化器相关参数的快照。优化器(Optimizer)是 Oracle 数据库的核心组件,负责将 SQL 语句转换为高效的执行计划(Execution Plan),其执行过程涉及复杂的成本估算、统计信息分析和算法决策。

该视图展示了影响优化器决策的所有环境设置,包括显式设置的参数和隐式使用的默认值。它与 V$SES_OPTIMIZER_ENV(会话级别)和 V$SQL_OPTIMIZER_ENV(语句级别)共同构成了一个层次结构,其中实例级别的设置具有最广泛的影响范围,影响整个数据库实例

2 字段详解

以下是 V$SYS_OPTIMIZER_ENV 视图包含的字段及其详细含义:

字段名称 (Field Name)数据类型描述
IDNUMBER参数的内部唯一标识符。
NAMEVARCHAR2(80)优化器参数的名称(例如:optimizer_mode, optimizer_index_cost_adj)。这是查询时最关键的字段。
SQL_FEATUREVARCHAR2(128)与该参数关联的 SQL 功能标识符(格式如:QKSFM_CBO),用于标识参数适用的优化器功能。
ISDEFAULTVARCHAR2(10)指示该参数值是否为系统默认值YES 表示是默认值,NO 表示该值已被修改。
VALUEVARCHAR2(512)该参数的当前有效值。这是最核心的数值字段。
DEFAULT_VALUEVARCHAR2(512)该参数的系统默认值。用于与当前值(VALUE)进行比较,判断参数是否被修改。
CON_IDNUMBER容器ID(Container ID)。在多租户环境(CDB)中,标识该参数属于哪个容器(PDB)。值为 0 表示属于 CDB$ROOT(根容器)。

关键字段解读

  • NAMEVALUE: 这是最重要的两个字段,用于查看参数的具体设置。
  • ISDEFAULT: 此字段对于参数审计非常关键。如果 ISDEFAULT='NO',则表示该参数的默认值已在实例级别被修改。
  • SQL_FEATURE: 这个字段将参数与具体的优化器功能关联起来,对于深入理解参数的作用范围很有帮助。

3 底层原理与相关对象

3.1 底层原理

  1. 优化器环境:Oracle 的基于成本的优化器(CBO, Cost-Based Optimizer)在为 SQL 语句生成执行计划时,会依赖于大量参数的值来决定其行为模式、成本计算方式等。V$SYS_OPTIMIZER_ENV 视图反映了所有这些影响优化器决策的系统级参数
  2. 数据来源:该视图的数据来源于系统全局区(SGA)中的内部内存结构,这些结构在实例启动时被初始化,加载了所有优化器参数的默认值或来自参数文件(spfilepfile)的显式设置。
  3. 10053 事件关联:这些视图实际上是 Oracle 10053 事件(优化器跟踪)中参数信息的一个子集。当启用 10053 事件进行跟踪时,优化器会将其决策过程(包括所有相关的参数值)详细写入跟踪文件。而 V$SYS_OPTIMIZER_ENV 提供了其中系统级参数的实时视图。
  4. 基表:同其他 V$ 视图一样,V$SYS_OPTIMIZER_ENV 基于一系列内部的 X$ 表(具体表名未公开),这些是 Oracle 在内存中维护的虚拟表,不建议直接查询

3.2 相关视图

视图名称描述
V$SES_OPTIMIZER_ENV显示会话级别(Session)的优化器环境参数。其字段与 V$SYS_OPTIMIZER_ENV 类似,但多了一个 SID 字段来标识会话。会话级别的参数设置会覆盖系统级别的设置。
V$SQL_OPTIMIZER_ENV显示语句级别(SQL)的优化器环境参数。它存储了执行特定 SQL 语句时生效的优化器参数值,对于诊断单个 SQL 的执行计划问题极为有用。
V$SYSTEM_PARAMETER显示所有系统参数的当前值(包括非优化器参数)。
V$PARAMETER显示当前会话中所有参数的生效值。

4 主要使用场景

  1. SQL 性能问题诊断:当发现某些 SQL 语句的执行计划不理想时,查看该系统级的优化器参数设置,确认是否存在不合理的全局配置。
  2. 参数审计与合规性检查:检查哪些优化器参数脱离了默认设置(ISDEFAULT='NO'),评估这些修改的必要性和影响。
  3. 环境一致性验证:在数据库迁移、升级或复制环境时,用于验证目标实例的优化器环境是否与源系统一致。
  4. 学习与理解:通过查看所有可用的优化器参数及其默认值,深入理解 Oracle 优化器的工作机制和可调优维度。

5 常用SQL查询示例

5.1 查看所有优化器环境参数

SELECT name, value, isdefault, sql_feature
FROM v$sys_optimizer_env
ORDER BY name;

5.2 查找所有已被修改的非默认参数

这对于快速识别出脱离默认配置的参数非常有用。

SELECT name, value, default_value, sql_feature
FROM v$sys_optimizer_env
WHERE isdefault = 'NO'
ORDER BY name;

5.3 查询特定的优化器参数

如果您关心某个特定参数(如优化器模式)的系统级设置。

SELECT name, value, isdefault, default_value
FROM v$sys_optimizer_env
WHERE name = 'optimizer_mode';

5.4 比较系统级别和会话级别的优化器环境

此查询可以显示当前会话是否覆盖了系统级的优化器参数设置。

SELECT sys.name,
       sys.value AS system_value,
       ses.value AS session_value,
       CASE WHEN sys.value != ses.value THEN 'DIFFERENT' ELSE 'SAME' END AS status
FROM v$sys_optimizer_env sys
JOIN v$ses_optimizer_env ses ON sys.name = ses.name AND ses.sid = USERENV('SID')
WHERE sys.value != ses.value
ORDER BY sys.name;

5.5 查看与特定SQL功能相关的参数

如果您想了解与某个特定优化器功能(通过SQL_FEATURE标识)相关的所有参数。

SELECT id, name, value, sql_feature
FROM v$sys_optimizer_env
WHERE sql_feature LIKE '%QKSFM_CBO%' -- 替换为您感兴趣的功能标识符
ORDER BY id;

6 重要优化器参数解读

通过 V$SYS_OPTIMIZER_ENV 可以查看许多影响优化器行为的关键参数,以下是其中一些重要的参数:

参数名称描述常见值
optimizer_mode优化器的模式,决定优化器的总体目标。all_rows, first_rows_n, first_rows_100
optimizer_index_cost_adj调整索引扫描成本计算的因子。值小于100会使优化器更倾向于选择索引扫描;大于100则会使优化器更倾向于全表扫描。默认值通常是 100
optimizer_index_caching告诉优化器索引块在缓冲区缓存中的预期缓存百分比。这会影响优化器对索引访问成本的计算。取值范围 0 到 100,默认值通常是 0
optimizer_dynamic_sampling控制动态采样的级别。动态采样可以在没有统计信息或统计信息陈旧时,为优化器提供数据特征信息。取值范围 0 到 11,默认值通常是 2
db_file_multiblock_read_count在全表扫描或快速全索引扫描时,一次I/O操作可以读取的数据块数量。这个值会影响全表扫描的成本计算。取决于操作系统和Oracle版本。
cursor_sharing控制字面值替换的行为,目的是减少硬解析。EXACT, FORCE, SIMILAR (后续版本中已弃用)

注意:修改这些参数需要谨慎,因为它们会全局地影响所有SQL语句的执行计划生成。在修改任何优化器参数之前,最好在测试环境中充分验证其影响。

7 多租户环境考虑

在 CDB 环境中,V$SYS_OPTIMIZER_ENV 默认显示根容器(CDB$ROOT)的参数。要查询特定 PDB 的优化器环境,需要切换到该 PDB 中再查询,或使用 CON_ID 字段进行过滤。

-- 查看所有容器中某个参数的值(需要在根容器中执行)
SELECT con_id, name, value, isdefault
FROM v$sys_optimizer_env
WHERE name = 'optimizer_mode'
ORDER BY con_id;

8 总结与最佳实践

  • 谨慎修改参数V$SYS_OPTIMIZER_ENV 显示的是实例级别的设置,修改其中的参数(通过 ALTER SYSTEM)会影响整个实例中的所有会话和语句,务必谨慎操作。
  • 优先使用更高层级设置:优化器环境遵循一个优先级层次结构:语句级 > 会话级 > 实例级。这意味着可以在更细粒度(如会话或语句级别)覆盖系统级的设置,以满足特定需求。
  • 结合其他视图诊断:当遇到 SQL 性能问题时,不应只查看 V$SYS_OPTIMIZER_ENV,还应结合 V$SQL_OPTIMIZER_ENV(查看语句级别设置)、执行计划(EXPLAIN PLANDBMS_XPLAN)以及统计信息来进行综合诊断。
  • 记录基线:在修改任何重要的优化器参数之前,考虑先查询 V$SYS_OPTIMIZER_ENV 并记录当前的参数设置,以便在出现问题时能够快速回退。

V$SYS_OPTIMIZER_ENV 视图是深入理解 Oracle 优化器行为、诊断复杂 SQL 性能问题的一把钥匙。通过它,您可以洞察到优化器决策背后的系统级配置,从而做出更明智的调优决策。

欢迎关注我的公众号《IT小Chen

### 查询达梦数据库 `v$sql_history` 视图可获取的字段信息 达梦数据库的 `v$sql_history` 是一个系统视图,用于记录已执行的 SQL 语句的历史信息,通常用于性能监控和 SQL 调优。该视图可以提供 SQL 执行的详细统计信息,例如执行时间、执行次数、资源消耗等关键指标。 根据达梦数据库文档和相关监控机制,`v$sql_history` 视图通常包含以下字段信息: #### 常见字段说明 | 字段名 | 数据类型 | 说明 | |---------------------|--------------|----------------------------------------------------------------------| | `sql_id` | VARCHAR2 | SQL 语句的唯一标识符,用于唯一标识一条 SQL 语句 | | `sql_text` | CLOB | SQL 语句的文本内容 | | `operation` | VARCHAR2 | SQL 操作类型(如 SELECT、INSERT、UPDATE、DELETE 等) | | `table_name` | VARCHAR2 | SQL 操作涉及的表名 | | `executions` | NUMBER | SQL 语句的执行次数 | | `elapsed_time` | NUMBER | SQL 语句的总耗时(单位为微秒),表示 SQL 执行的总时间 | | `cpu_time` | NUMBER | SQL 语句消耗的 CPU 时间(单位为微秒) | | `disk_reads` | NUMBER | SQL 语句执行过程中发生的物理读次数 | | `buffer_gets` | NUMBER | SQL 语句执行过程中发生的逻辑读次数 | | `rows_processed` | NUMBER | SQL 语句处理的数据行数 | | `first_load_time` | TIMESTAMP | SQL 语句首次加载到共享池的时间 | | `last_exec_time` | TIMESTAMP | SQL 语句最后一次执行的时间 | | `module` | VARCHAR2 | 执行 SQL 的模块名称(如 JDBC、PL/SQL 等) | | `action` | VARCHAR2 | 执行 SQL 的操作名称(如插入、更新、查询等) | | `user_id` | NUMBER | 执行 SQL 的用户 ID | | `session_id` | NUMBER | 执行 SQL 的会话 ID | | `sql_plan_hash_value` | NUMBER | SQL 执行计划的哈希值,用于关联执行计划信息 | | `optimizer_mode` | VARCHAR2 | SQL 优化器的模式(如 ALL_ROWS、FIRST_ROWS 等) | | `sql_type` | VARCHAR2 | SQL 的类型(如 DML、DDL、PL/SQL 等) | #### 示例查询语句 ```sql SELECT sql_id, sql_text, operation, table_name, executions, elapsed_time, cpu_time, disk_reads, buffer_gets, rows_processed, first_load_time, last_exec_time, module, action, user_id, session_id, sql_plan_hash_value, optimizer_mode, sql_type FROM v$sql_history WHERE table_name = 'your_table_name' ORDER BY last_exec_time DESC; ``` ### 注意事项 1. **监控参数配置** 为了确保 `v$sql_history` 能够采集到完整的 SQL 信息,需要启用监控功能。具体需要设置以下参数: - `ENABLE_MONITOR=1`:启用监控功能。 - `MONITOR_SQL_EXEC=1`:针对 SQL 执行的监控。 - `ENABLE_MONITOR_DMSQL=1`:启用 DMSQL 的监控功能[^1]。 2. **性能影响** 启用监控功能会对数据库性能产生一定影响,特别是在高并发或高负载的环境中。建议在生产环境中仅启用必要的监控项,并定期清理历史数据以减少资源占用。 3. **数据存储** `v$sql_history` 中的数据通常存储在内存中,重启数据库后可能会丢失。如果需要长期保存 SQL 历史记录,建议定期将数据导出到持久化存储中。 4. **字段扩展性** 达梦数据库的 `v$sql_history` 视图可能会根据版本不同而包含额外字段。建议通过 `DESC v$sql_history` 命令查看具体版本的字段列表。 ### 相关问题 1. 如何通过 `v$sql_history` 分析达梦数据库的性能瓶颈? 2. `v$sql_history` 和 `v$sql_stat` 之间的区别是什么? 3. 如何在达梦数据库中启用 SQL 监控功能? 4. `v$sql_history` 是否支持自定义字段扩展? 5. 如何将 `v$sql_history` 中的历史数据导出到外部存储?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值