
🧠 Oracle 19C V$SORT_SEGMENT 视图详解
1. 视图概述与作用
V$SORT_SEGMENT 是 Oracle 数据库中用于监控临时表空间中排序段(Sort Segment)使用情况的关键动态性能视图。它提供了关于临时表空间中排序段的实时信息,帮助DBA诊断和管理磁盘排序操作。
核心作用:
- 监控临时空间使用:实时监控临时表空间中排序段的使用情况
- 诊断排序性能:帮助识别磁盘排序操作导致的性能问题
- 空间管理:管理临时表空间的空间分配和回收
- 性能优化:为排序操作和临时表空间配置提供优化依据
2. 字段含义详解
下表详细说明了 V$SORT_SEGMENT 视图中的各个字段:
| 字段名 (Column Name) | 数据类型 (Datatype) | 描述 (Description) |
|---|---|---|
| TABLESPACE_NAME | VARCHAR2(30) | 临时表空间的名称。标识该排序段所属的临时表空间。 |
| SEGMENT_FILE | NUMBER | 排序段所在的文件号。对应临时数据文件的文件编号。 |
| SEGMENT_BLOCK | NUMBER | 排序段的起始块号。标识排序段在文件中的起始位置。 |
| EXTENT_SIZE | NUMBER | 排序段的扩展区大小(以块为单位)。 |
| CURRENT_USERS | NUMBER | 当前使用该排序段的用户(会话)数量。 |
| TOTAL_EXTENTS | NUMBER | 排序段的总扩展区数量。 |
| TOTAL_BLOCKS | NUMBER | 排序段的总块数。 |
| USED_EXTENTS | NUMBER | 已使用的扩展区数量。 |
| USED_BLOCKS | NUMBER | 已使用的块数。 |
| FREE_EXTENTS | NUMBER | 空闲的扩展区数量。 |
| FREE_BLOCKS | NUMBER | 空闲的块数。 |
| ADDED_EXTENTS | NUMBER | 已添加的扩展区数量(由于排序需要而动态添加)。 |
| EXTENT_HITS | NUMBER | 扩展区命中次数。表示重用现有扩展区的次数。 |
| FREED_EXTENTS | NUMBER | 已释放的扩展区数量。 |
| FREE_REQUESTS | NUMBER | 请求释放扩展区的次数。 |
| MAX_SIZE | NUMBER | 排序段曾经达到的最大大小(以块为单位)。 |
| MAX_USED_EXTENTS | NUMBER | 排序段曾经使用的最大扩展区数量。 |
| MAX_USED_BLOCKS | NUMBER | 排序段曾经使用的最大块数。 |
| MAX_SORT_SIZE | NUMBER | 最大排序大小(以块为单位)。 |
| RELATIVE_FNO | NUMBER | 相对文件号。用于标识数据文件。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该数据属于哪个容器(PDB)。对于非CDB环境,此值为0。 |
3. 使用场景
V$SORT_SEGMENT 在以下场景中非常重要:
- 磁盘排序监控:当大量排序操作无法在PGA中完成而需要使用临时表空间时,监控排序段的使用情况
- 临时空间压力诊断:当临时表空间使用率过高或出现空间不足错误时,诊断问题根源
- 性能问题排查:当数据库性能下降且怀疑与磁盘排序相关时,分析排序段的使用模式
- 容量规划:基于历史使用数据规划临时表空间的容量
- 多租户环境管理:在CDB环境中监控各个PDB的临时表空间使用情况
4. 底层原理与相关知识点
4.1 排序段工作原理
排序段是临时表空间中的特殊段,用于存储以下类型的临时数据:
- 排序操作:ORDER BY、GROUP BY、DISTINCT等操作产生的中间结果
- 哈希连接:哈希连接操作使用的哈希区域
- 临时表数据:全局临时表(GLOBAL TEMPORARY TABLE)的数据
- 其他操作:某些类型的索引创建、LOB操作等
当PGA(Program Global Area)中的排序区不足以容纳排序数据时,Oracle会将数据写入临时表空间的排序段中。
4.2 临时表空间架构
临时表空间使用特殊的临时文件(Tempfile),与常规数据文件不同:
- 临时文件不记录重做日志(Redo Log),只记录少量撤销信息
- 使用排序段来管理空间分配,而不是传统的段管理方式
- 空间分配和回收是动态的,按需分配,使用后释放
4.3 关键参数
- SORT_AREA_SIZE:指定每个会话用于排序的内存区域大小(已废弃,推荐使用PGA自动管理)
- PGA_AGGREGATE_TARGET:指定PGA总内存目标大小,自动管理排序内存
- TEMP_SPACE_LIMIT:限制临时表空间的最大使用量(在多租户环境中)
5. 相关视图
| 视图名称 | 主要用途描述 |
|---|---|
| V$SORT_USAGE | 显示当前正在进行排序操作的会话信息,包括使用的临时空间大小 |
| DBA_TEMP_FREE_SPACE | 显示临时表空间的空闲空间信息 |
| V$TEMPFILE | 显示临时文件的信息 |
| V$TEMPSEG_USAGE | 显示临时段的使用信息(12c之后替换V$SORT_USAGE) |
| V$PGASTAT | 显示PGA内存使用的统计信息 |
| V$SYSSTAT | 显示系统统计信息,包括排序相关的统计 |
6. 基表信息
V$SORT_SEGMENT 视图基于底层的 X$ 表构建,这些表是Oracle内部的虚拟内存表。根据内部结构,它很可能基于 **XKTTSS∗∗或类似的XKTTSS** 或类似的XKTTSS∗∗或类似的X表。
重要提示:X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表是Oracle的内部结构,没有官方文档支持,其结构和命名可能随版本变化。强烈建议不要直接查询X表,而是通过公开的V$视图获取信息。
7. 常用查询 SQL
7.1 排序段使用情况概览
SELECT
tablespace_name,
current_users,
total_blocks,
used_blocks,
free_blocks,
ROUND((used_blocks / NULLIF(total_blocks, 0)) * 100, 2) AS usage_pct,
max_used_blocks,
max_size
FROM
v$sort_segment
ORDER BY
tablespace_name;
7.2 临时表空间压力分析
SELECT
tablespace_name,
current_users AS active_users,
total_blocks AS total_blocks,
used_blocks AS used_blocks,
free_blocks AS free_blocks,
ROUND((used_blocks / NULLIF(total_blocks, 0)) * 100, 2) AS usage_pct,
CASE
WHEN (free_blocks / NULLIF(total_blocks, 0)) < 0.1 THEN 'CRITICAL: Less than 10% free'
WHEN (free_blocks / NULLIF(total_blocks, 0)) < 0.2 THEN 'WARNING: Less than 20% free'
ELSE 'OK: Sufficient free space'
END AS space_status
FROM
v$sort_segment
ORDER BY
usage_pct DESC;
7.3 排序操作效率分析
SELECT
tablespace_name,
extent_size,
extent_hits,
added_extents,
freed_extents,
ROUND(extent_hits / NULLIF((extent_hits + added_extents), 0) * 100, 2) AS cache_hit_ratio,
CASE
WHEN added_extents > 1000 THEN 'HIGH: Many extent allocations'
WHEN added_extents > 100 THEN 'MEDIUM: Moderate extent allocations'
ELSE 'LOW: Few extent allocations'
END AS allocation_activity
FROM
v$sort_segment
ORDER BY
added_extents DESC;
7.4 关联排序段和会话信息
SELECT
ss.tablespace_name,
ss.current_users,
su.sid,
su.sql_id,
su.contents,
su.segtype,
su.blocks AS blocks_used,
su.blocks * (SELECT value FROM v$parameter WHERE name = 'db_block_size') / 1024 / 1024 AS mb_used
FROM
v$sort_segment ss,
v$sort_usage su
WHERE
ss.tablespace_name = su.tablespace
ORDER BY
ss.tablespace_name, su.blocks DESC;
7.5 临时表空间历史使用分析
SELECT
tablespace_name,
max_used_blocks,
max_size,
ROUND((max_used_blocks / NULLIF(max_size, 0)) * 100, 2) AS max_usage_pct,
total_extents,
max_used_extents,
ROUND((max_used_extents / NULLIF(total_extents, 0)) * 100, 2) AS max_extent_usage_pct
FROM
v$sort_segment
ORDER BY
max_usage_pct DESC;
8. 最佳实践与注意事项
- 监控临时空间使用:定期监控
V$SORT_SEGMENT,确保临时表空间有足够的空闲空间 - 优化排序操作:如果发现大量磁盘排序,考虑优化SQL语句或增加PGA大小
- 合理配置临时表空间:根据历史使用模式(
MAX_USED_BLOCKS)配置临时表空间大小 - 多租户环境考虑:在CDB环境中,为每个PDB分配合适的临时表空间配额
- 预防空间耗尽:设置适当的预警阈值,防止临时表空间耗尽导致业务中断
- 性能调优:关注扩展区分配频率(
ADDED_EXTENTS),高频分配可能表明排序效率低下 - 结合其他视图:将
V$SORT_SEGMENT与V$SORT_USAGE、V$PGASTAT等视图结合分析,全面了解排序性能
通过正确使用 V$SORT_SEGMENT 视图,DBA可以有效地监控和管理临时表空间的使用,预防空间不足问题,优化排序操作性能,确保数据库的稳定运行。
欢迎关注我的公众号《IT小Chen》
743

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



