重庆思庄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 |