重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

标题: ORA-01555:SQL执行时间过长而错过已被覆盖或修改的数据 [打印本页]

作者: Inkcup    时间: 2025-7-15 15:30
标题: ORA-01555:SQL执行时间过长而错过已被覆盖或修改的数据
本帖最后由 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.临时解决方案: 尝试在数据库负载较低时运行此查询







欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2