帖两个大事务查询SQL

本文提供了一种查询长时间运行的大事务的方法,通过SQL语句展示如何获取事务的状态信息、执行进度及预估剩余时间等关键指标,并进一步扩展到包含具体执行SQL语句的详细信息。

--大事务
select sid,serial#,start_time,last_update_time,sofar/totalwork*100,elapsed_seconds,time_remaining,
       round(elapsed_seconds/60) elapsed_minutes,
       round(elapsed_seconds/(sofar/totalwork)/60) total_minutes,
       round(elapsed_seconds/(sofar/totalwork)/60) - round(elapsed_seconds/60) need_minutes
       ,username,opname,target,target_desc,message
from v$session_longops
where totalwork <> 0 and sofar!=totalwork --sofar/totalwork < 1
order by sofar/totalwork*100

--大事务(查询执行的SQL语句)
select sid,serial#,start_time,last_update_time,sofar/totalwork*100,elapsed_seconds,time_remaining,
       round(elapsed_seconds/60) elapsed_minutes,
       round(elapsed_seconds/(sofar/totalwork)/60) total_minutes,
       round(elapsed_seconds/(sofar/totalwork)/60) - round(elapsed_seconds/60) need_minutes
       ,username,opname,target,target_desc,message
     ,s.SQL_TEXT,s.SQL_FULLTEXT,s.MODULE,s.SERVICE,s.PARSING_SCHEMA_NAME
     ,s.OPTIMIZER_MODE,s.OPTIMIZER_COST,s.ROWS_PROCESSED
     ,s.PLSQL_EXEC_TIME,s.USER_IO_WAIT_TIME,s.BUFFER_GETS,s.DISK_READS
     ,s.LAST_LOAD_TIME,s.LAST_ACTIVE_TIME,s.FIRST_LOAD_TIME,s.CPU_TIME
from v$session_longops l,v$sql s
where l.SQL_ADDRESS = s.ADDRESS and l.SQL_ID = s.SQL_ID
  and totalwork <> 0 and sofar!=totalwork --sofar/totalwork < 1
order by sofar/totalwork*100,l.ELAPSED_SECONDS desc,l.last_update_time desc

 

 

 

www.cects.cn

不同数据库管理系统对于事务中SQL执行顺序的处理存在差异。一般而言,在单个事务内,SQL语句会按照代码编写的顺序依次执行,但也有特殊情况。例如在SSH框架下,spring的事务中提交时,Hibernate最终执行SQL语句是按INSERT, UPDATE, DELETE的顺序执行,而非代码顺序[^2]。 对于两个事务,当它们并发执行时,执行顺序会受事务调度策略以及锁机制的影响。若事务之间存在资源竞争,数据库会使用锁来保证数据的一致性,这可能会导致事务中的SQL语句交错执行。此外,还可以通过事务控制语言(TCL)来管理事务的执行顺序,如使用COMMIT提交事务、ROLLBACK回滚事务、SAVEPOINT设置保存点和SET TRANSACTION指定交易特征等[^3]。 在常见的SQL查询执行中,有一个基本的顺序:from - join - on(on条件用于生成临时表) - where - group by(此时开始可使用select中的别名,后续语句也能使用) - 聚合函数(如avg、sum等) - having(需和group by搭配) - select - distinct - order by - limit ,不过这是针对单个查询语句的执行顺序,在事务中还需考虑事务本身的特性和并发情况[^4]。 ### 代码示例 以下是一个简单的Python和SQLAlchemy库操作事务的示例,展示了事务中SQL的执行顺序: ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine = create_engine('sqlite:///test.db') Session = sessionmaker(bind=engine) session = Session() try: # 开始事务 session.begin() # 执行SQL语句,这里只是示例,具体表和字段需根据实际情况修改 session.execute("INSERT INTO table1 (column1) VALUES ('value1')") session.execute("UPDATE table2 SET column2 = 'new_value' WHERE id = 1") # 提交事务 session.commit() except Exception as e: # 回滚事务 session.rollback() print(f"Error: {e}") finally: session.close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值