oracle闪回事务查询数据多,查询太慢

用flash_transaction_query回滚已提交事务,加上条件筛选过后,一直查询中

flash_transaction_query回滚事务提交慢的问,一个是检查您回滚的事务涉及的记录数是否过大。尤其当的您数据库访问比较多的时候,比较繁忙的时候。

切换undo_tablespace
CREATE undo tablespace undotbs2 datafile '/home/ora10g/oradata/roger/undotbs2_01.dbf' SIZE 20m;
 ALTER system SET undo_tablespace=undotbs2;

 ALTER system SET undo_retention=900;  #降低记录数

具体您可以看看同类问题的解决方法:
https://blog.csdn.net/rudygao/article/details/37501421

以下答案基于ChatGPT与GISer Liu编写:
如果使用Oracle的闪回事务查询功能,查询数据量很大并且查询速度很慢,那么可以考虑以下几种方法来优化:

  • 使用索引:如果查询语句中涉及到的字段没有索引,那么查询的速度会非常慢。因此,可以考虑创建索引来优化查询速度。

  • 缩小查询范围:可以通过添加条件来缩小查询的范围,比如时间范围、关键字等。这样可以减少查询的数据量,提高查询速度。

  • 优化SQL语句:检查SQL语句是否存在不必要的联接、子查询等,如果存在可以进行优化,以提高查询速度。

  • 增加系统资源:如果查询数据量非常大,可以考虑增加系统资源,比如增加内存、CPU等,以提高系统性能。

  • 限制查询结果数量:可以使用ROWNUM或LIMIT关键字限制查询结果的数量,从而减少查询的数据量。

  • 分批查询:将查询结果分批获取,每次获取一定数量的数据,以减轻系统负担,提高查询速度。

希望以上建议对您有所帮助。

参考GPT和自己的思路,flash_transaction_query 是一个函数,是在 Flask 应用程序上下文中调用数据库事务时的装饰器,它用于确保每次请求结束后都会提交或回滚事务。如果您想回滚已经提交的事务,可以在函数中抛出异常,例如:

from flask import flash, redirect, url_for
from yourapp import db

@app.route('/your_route')
def your_route():
    try:
        # your database operations here
        db.session.commit() # 提交事务
    except Exception as e:
        db.session.rollback() # 回滚事务
        flash('An error occurred: {}'.format(str(e)))
        return redirect(url_for('error_handler'))

    return redirect(url_for('success_handler'))

上面的代码演示了如何在 Flask 中使用 db.session.rollback() 来回滚已提交的事务。如果有条件筛选过后,一直查询中,可能是因为该操作一直没有完成,导致事务没有被提交或回滚,需要根据具体的代码和错误信息进一步分析问题原因。

仅供参考:
flashback transaction query 是一个强大的工具,可以查询历史版本的数据,但是也会对性能产生一定的影响。如果你的查询比较复杂,耗时较长,那么可以尝试对查询进行优化,包括但不限于以下几个方面:

1.创建索引:通过创建索引可以加快数据查询的速度。可以使用 explain plan 来分析查询语句的执行计划,找到查询语句中的瓶颈,然后针对性地创建索引。注意,创建索引会对写入操作的性能产生一定的影响,需要谨慎处理。

2.优化查询语句:查询语句的编写方式也会影响查询性能。可以尝试优化查询语句,比如避免使用子查询、避免使用 like 等操作。

3.分区表:如果表中数据较大,可以使用分区表来加快查询速度。

4.调整系统参数:调整一些系统参数,比如 sga_max_size、pga_aggregate_target、db_file_multiblock_read_count 等,可以对查询性能产生影响。

5.加强硬件:增加CPU、内存、存储等硬件资源可以提高数据库的查询性能。

除此之外,如果你的数据量较大,可以考虑使用分布式数据库或者使用缓存等技术来提高查询性能。

关于ORACLE大表(数据量)查询缓慢的一种解决方案

借鉴下
https://blog.csdn.net/weixin_40735297/article/details/101757886

查询过多或者过于频繁可能会导致性能问题,首先可以使用explain plan命令来查看查询计划,找到慢查询的瓶颈所在。然后限制查询范围,缩小数据集。闪回事务查询操作的范围越小,执行速度就越快。可以根据时间、事务类型、表名等条件进行筛选。对于大表或者经常进行闪回事务查询的表,可以考虑使用分区或者索引组织表来优化查询性能。

该回答引用ChatGPT
如果使用flashback_transaction_query查询的数据量很大,会导致查询时间过长。有几种方法可以尝试解决这个问题:

在查询时添加更多的条件筛选,缩小查询范围。例如,使用时间范围、相关用户或表等条件进行筛选,以减少查询的数据量。

使用Oracle的DBMS_FLASHBACK_ARCHIVE包中的子程序PURGE_FLASHBACK_ARCHIVE来清除已过期的闪回区域,以释放空间并提高查询性能。

如果使用了Oracle 12c及以上版本,则可以尝试使用as of子句代替flashback_transaction_query进行查询。as of子句可以基于时间点查询数据,因此可以更加高效地检索。

调整数据库的参数以提高查询性能。例如,增加内存、调整磁盘缓存等。可以使用V$FLASH_RECOVERY_AREA_USAGE和V$RECOVERY_FILE_DEST查看闪回区域的使用情况和磁盘空间限制,以确定是否需要调整参数。

需要根据具体情况进行适当的优化,以提高查询性能。

在 MySQL MGR (MySQL Group Replication) 中,从库在执行主库上的事务时可能会出现同步错误,导致从库的数据与主库不一致。你提到的通过 flashback_transaction_query 命令回滚已提交事务,但是卡在查询中,可能是因为该命令的执行涉及到大量数据,导致查询时间过长。

以下是一些可能的解决方法:

1.调整 max_execution_time 参数:在执行 flashback_transaction_query 命令时,可以设置 max_execution_time 参数来限制查询的最长时间。默认情况下,这个参数的值是 60 秒。你可以尝试将其增加,例如设置为 300 秒,看是否能够解决问题。

2.分批次回滚:如果回滚的数据量过大,可以考虑将回滚操作分成多个批次进行,每次回滚一部分数据。你可以通过添加 LIMIT 子句来限制每次回滚的数据量,例如 LIMIT 10000。

3.检查 MySQL MGR 的状态:如果从库出现同步错误,可能是因为 MGR 集群中的节点出现了问题。你可以检查 MGR 集群的状态,确保所有节点都处于正常状态,如果有节点异常,可以尝试进行修复。

4.重新同步从库:如果无法通过回滚操作解决同步错误,可以考虑重新同步从库。可以使用 CHANGE MASTER TO 命令将从库重新指向主库,并重新进行数据同步。但是这种方法可能会导致数据的丢失,因此应谨慎使用。

总之,如果通过上述方法无法解决问题,建议查看 MySQL MGR 的日志,以确定具体的错误原因,并采取相应的措施解决问题。