oracle临时表空间组不是负载均衡器,而是逻辑分发容器;会话登录时通过sid+inst_id哈希固定绑定某tempfile,后续全程不切换,rac下须为每实例配置专属tempfile并验证状态。
临时表空间组本身不均衡——它根本就不是为负载均衡设计的,只是个逻辑分发容器。所谓“轮询”只发生在会话首次分配时的哈希计算,后续全程绑定不变,更不会感知文件使用率或io压力。
为什么 v$sort_segment 显示严重倾斜?
因为 session 一旦登录,就通过 SID + INST_ID 哈希固定到某个临时表空间的某个 tempfile,后续所有排序、哈希连接、GTTS 写入都挤在那一个文件上。即使组里有 4 个表空间,只要哈希结果集中落在 temp01,其他三个就是摆设。
-
v$sort_segment中used_blocks持续远高于其他成员,是典型哈希倾斜,不是配置没生效 - 查
gv$sort_segment必须加inst_id分组,否则 RAC 下会误判:节点 1 看不到节点 2 的真实占用 -
dba_temp_files只显示定义大小,看不出实时争抢;真正要盯的是v$sort_segment.used_blocks和v$tempseg_usage的会话分布
RAC 环境下必须为每个实例配专属 tempfile
多个实例共用同一个 tempfile(哪怕在 ASM 共享盘上),就会抢同一文件头 latch,出现持续的 enq: TS – contention,而不是“自动分摊”。
- 路径必须带实例标识,例如:
'+DATADG/racdb_inst1/temp01.dbf',禁止用'+DATADG/racdb/temp01.dbf' - 禁用 OMF:
ALTER SYSTEM SET db_create_file_dest = '',否则 Oracle 自动补路径,大概率撞车 - 每个实例单独执行:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_inst1,该命令不广播 - 逐实例验证:
SELECT file_name, status, enabled FROM dba_temp_files WHERE tablespace_name = 'TEMP_INST1',确保status = ONLINE且enabled = YES
单实例高并发时怎么缓解哈希集中?
没法改哈希算法,但可以影响 segment header 分配倾向——让 Oracle 倾向选“空闲”的 extent 起点。
- 组内所有临时表空间必须统一用
UNIFORM SIZE,比如都设为1M;混用AUTOALLOCATE会导致 header 分布不均,加剧倾斜 - 每个
tempfile控制在 2–8GB,避免单文件过大拖慢 checkpoint;AUTOEXTEND参数(NEXT、MAXSIZE)必须完全一致,否则某些文件先撑满,轮询失效 - 添加文件必须用
ADD TEMPFILE,RESIZE不新增物理文件,REUSE仅用于重建已删除文件 - 别信“建组就能均衡”:如果所有
tempfile都在一块 SSD 上,IO 瓶颈照旧;物理磁盘/ASM diskgroup 必须隔离
最常被忽略的一点:组名一致 ≠ 物理资源可共享。RAC 中每个实例的 tempfile 必须真实可写、路径唯一、状态在线——少验证一步,就可能让整个组退化成单点瓶颈。











