本帖最后由 Inkcup 于 2025-7-15 15:32 编辑
ORA-01555是一个较为常见的报错,长时间运行的查询尝试读取已被修改且覆盖的数据时,便容易产生这个报错。
比如: ORA-01555 caused by SQL statement below (SQL ID: c2hmxxaycdr03, Query Duration=0 sec, SCN: 0x0d41.f761d6c0): SELECT "PATIENT_ID","VISIT_ID" FROM "PAT_VISIT" "B" WHERE "PATIENT_ID"='H26014914' AND "VISIT_ID"=2
由案例可知:
查询语句为: SELECT "PATIENT_ID","VISIT_ID" FROM "PAT_VISIT" "B" WHERE "PATIENT_ID"='H26014914' AND "VISIT_ID"=2
查询持续时间为: 0秒(这对ORA-01555来说不常见,表明当前数据库环境可能存在严重的资源争用问题)
可能导致报错的因素:
1.系统高负载: 大量并发事务修改PAT_VISIT表
2.撤销表空间太小: 撤销段被过快回收
3.长时间运行的事务: 占用了其他查询所需的撤销信息
4.查询在批量处理高峰期执行
解决方案建议:
1.扩大撤销表空间:
ALTER TABLESPACE UNDOTBS1 ADD DATAFILE '/路径/undo02.dbf' SIZE 2G;
2.调整撤销保留时间:
ALTER SYSTEM SET undo_retention=1800; -- 30分钟
3.优化查询:
确保PATIENT_ID和VISIT_ID上有适当索引
考虑添加(PATIENT_ID, VISIT_ID)组合索引
4.检查长时间运行的事务:
SELECT s.sid, s.serial#, s.username, s.program, t.start_time,
(SYSDATE - t.start_time)*24*60 运行分钟数
FROM v$transaction t, v$session s
WHERE t.ses_addr = s.saddr
ORDER BY 运行分钟数 DESC;
5.临时解决方案: 尝试在数据库负载较低时运行此查询
|