
🧠 Oracle 19C V$SQLCOMMAND 视图详解
1. 视图概述与作用
V$SQLCOMMAND 是 Oracle 数据库中一个基础但重要的动态性能视图,它提供了所有支持的 SQL 命令类型及其对应的命令代码的映射信息。这个视图主要用于理解和分类 SQL 语句的类型,是许多数据库监控和审计工具的基础。
核心作用:
- SQL命令类型识别:将数字命令代码映射为可读的SQL命令类型
- SQL分类统计:用于对SQL语句按类型进行分类和统计
- 审计和监控:支持数据库审计操作和SQL活动监控
- 工具开发基础:为数据库监控工具提供命令类型解析功能
2. 字段含义详解
下表详细说明了 V$SQLCOMMAND 视图中的各个字段:
| 字段名 (Column Name) | 数据类型 (Datatype) | 描述 (Description) |
|---|---|---|
| COMMAND_TYPE | NUMBER | SQL命令类型的数字代码。这是最重要的字段,用于在各种V$视图中标识SQL类型。 |
| NAME | VARCHAR2(40) | SQL命令类型的英文名称。如SELECT, INSERT, UPDATE, DELETE等。 |
| COMMAND_CLASS | VARCHAR2(40) | SQL命令的类别分组。将相关命令分组,如DDL, DML, DCL等。 |
| SQL_TEXT | VARCHAR2(40) | SQL命令的文本描述。通常与NAME相同,但格式可能略有不同。 |
| RETURNS_ROWS | NUMBER | 指示该命令是否返回行。 • 0: 不返回行(如DML) • 1: 返回行(如SELECT) |
3. 使用场景
V$SQLCOMMAND 在以下场景中非常重要:
- SQL监控和分类:在监控SQL性能时,按命令类型对SQL进行分类统计
- 数据库审计:在审计数据库中,识别不同类型的SQL操作
- 性能分析:分析各类SQL命令的资源消耗模式
- 应用行为分析:了解应用程序发出的SQL命令类型分布
- 安全监控:监控敏感操作(如DDL命令)的执行情况
4. 底层原理与相关知识点
4.1 SQL命令类型体系
Oracle 内部使用数字代码来表示不同类型的SQL命令:
- 命令类型编码:每个SQL操作类型都有唯一的数字标识
- 命令分类:命令被分为DDL、DML、DCL、会话控制等类别
- 系统内部使用:这些代码在系统内部广泛使用,用于快速识别SQL类型
4.2 常见命令类型示例
以下是一些常见的命令类型代码:
| COMMAND_TYPE | NAME | 描述 |
|---|---|---|
| 1 | CREATE TABLE | 创建表 |
| 2 | INSERT | 插入数据 |
| 3 | SELECT | 查询数据 |
| 6 | UPDATE | 更新数据 |
| 7 | DELETE | 删除数据 |
| 26 | CREATE INDEX | 创建索引 |
| 28 | ALTER TABLE | 修改表 |
| 29 | CREATE VIEW | 创建视图 |
| 32 | CREATE SEQUENCE | 创建序列 |
| 44 | COMMIT | 提交事务 |
| 45 | ROLLBACK | 回滚事务 |
4.3 命令分类体系
Oracle 将SQL命令分为以下几个主要类别:
- DDL (Data Definition Language):数据定义语言
- DML (Data Manipulation Language):数据操纵语言
- DCL (Data Control Language):数据控制语言
- 事务控制:事务管理命令
- 会话控制:会话管理命令
- 系统控制:系统管理命令
5. 相关视图
| 视图名称 | 主要用途描述 |
|---|---|
| V$SQL | 包含详细的SQL执行信息,包括COMMAND_TYPE字段 |
| V$SQLAREA | SQL区域的统计信息,包含COMMAND_TYPE字段 |
| DBA_AUDIT_TRAIL | 审计跟踪信息,包含操作类型信息 |
| V$SQLSTATS | SQL统计信息,包含命令类型信息 |
6. 基表信息
VSQLCOMMAND视图基于底层的∗∗XSQLCOMMAND 视图基于底层的 **XSQLCOMMAND视图基于底层的∗∗X 表**构建,这些表是Oracle内部的虚拟内存表。根据内部结构,它很可能基于 **XKQLFSQ∗∗或类似的XKQLFSQ** 或类似的XKQLFSQ∗∗或类似的X表。
重要提示:X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表,而是通过公开的V$视图获取信息。
7. 常用查询 SQL
7.1 查看所有支持的SQL命令类型
SELECT
command_type,
name,
command_class,
sql_text,
CASE returns_rows
WHEN 0 THEN 'No'
WHEN 1 THEN 'Yes'
ELSE 'Unknown'
END AS returns_rows
FROM
v$sqlcommand
ORDER BY
command_type;
7.2 按命令类别分组统计
SELECT
command_class,
COUNT(*) as command_count,
LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) as commands
FROM
v$sqlcommand
GROUP BY
command_class
ORDER BY
command_class;
7.3 关联V$SQL分析当前SQL命令分布
SELECT
sc.name as command_name,
sc.command_class,
COUNT(*) as sql_count,
SUM(s.executions) as total_executions,
ROUND(AVG(s.buffer_gets)) as avg_buffer_gets,
ROUND(AVG(s.disk_reads)) as avg_disk_reads
FROM
v$sql s
JOIN
v$sqlcommand sc ON s.command_type = sc.command_type
WHERE
s.executions > 0
GROUP BY
sc.name, sc.command_class
ORDER BY
total_executions DESC;
7.4 查找返回行的命令类型
SELECT
command_type,
name,
command_class
FROM
v$sqlcommand
WHERE
returns_rows = 1
ORDER BY
command_type;
7.5 监控DDL命令执行情况
SELECT
sc.name as command_type,
s.sql_text,
s.parsing_schema_name,
s.first_load_time,
s.executions
FROM
v$sql s
JOIN
v$sqlcommand sc ON s.command_type = sc.command_type
WHERE
sc.command_class LIKE '%DDL%'
AND s.first_load_time > SYSDATE - 1
ORDER BY
s.first_load_time DESC;
7.6 SQL命令类型使用频率分析
SELECT
sc.command_class,
sc.name as command_type,
COUNT(DISTINCT s.sql_id) as distinct_sql_count,
SUM(s.executions) as total_executions,
ROUND(SUM(s.buffer_gets) / NULLIF(SUM(s.executions), 0)) as avg_gets_per_exec
FROM
v$sql s
JOIN
v$sqlcommand sc ON s.command_type = sc.command_type
WHERE
s.executions > 0
GROUP BY
sc.command_class, sc.name
ORDER BY
total_executions DESC;
8. 最佳实践与注意事项
- 命令类型理解:熟悉常见的命令类型代码,便于快速识别SQL类型
- 监控分类:在SQL监控中按命令类型进行分类,便于分析工作负载特征
- 审计应用:在数据库审计中,使用命令类型识别敏感操作
- 性能分析:结合其他V$视图,分析不同类型SQL的性能特征
- 版本兼容性:注意不同Oracle版本可能支持的命令类型有所变化
- 多租户环境:在CDB环境中,命令类型是全局一致的
9. 实际应用示例
9.1 创建SQL监控仪表板
SELECT
sc.command_class,
COUNT(*) as active_sql_count,
SUM(s.executions) as total_executions,
ROUND(SUM(s.cpu_time)/1000000, 2) as total_cpu_sec,
ROUND(SUM(s.buffer_gets)/1000, 2) as total_buffer_gets_k
FROM
v$sql s
JOIN
v$sqlcommand sc ON s.command_type = sc.command_type
WHERE
s.last_active_time > SYSDATE - 1/24
GROUP BY
sc.command_class
ORDER BY
total_cpu_sec DESC;
9.2 识别高负载DML操作
SELECT
sc.name as command_type,
s.sql_id,
substr(s.sql_text, 1, 50) as sql_text,
s.executions,
s.buffer_gets,
ROUND(s.buffer_gets/NULLIF(s.executions, 0)) as avg_gets_per_exec,
s.rows_processed
FROM
v$sql s
JOIN
v$sqlcommand sc ON s.command_type = sc.command_type
WHERE
sc.command_class = 'DML'
AND s.buffer_gets > 10000
ORDER BY
s.buffer_gets DESC;
通过正确使用 V$SQLCOMMAND 视图,DBA可以更好地理解和分类数据库中的SQL工作负载,为性能监控、审计和分析提供重要基础。这个视图虽然简单,但在数据库管理和监控中发挥着重要作用。
欢迎关注我的公众号《IT小Chen》
682

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



