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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 32|回复: 0
打印 上一主题 下一主题

[性能调整] ORA-01555:SQL执行时间过长而错过已被覆盖或修改的数据

[复制链接]
跳转到指定楼层
楼主
发表于 7 小时前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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.临时解决方案: 尝试在数据库负载较低时运行此查询


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2025-7-15 23:16 , Processed in 0.121553 second(s), 25 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表