【问题标题】:Oracle report with long running SQL具有长时间运行 SQL 的 Oracle 报告
【发布时间】:2017-09-28 17:18:14
【问题描述】:

我有一个使用 Oracle Report Builder 生成的报告。该报告有 82 个 SQL 查询。几乎每个查询都执行繁重的计算。我正在做有双重记账的财务报告。有时,当我生成报告时,条目不相符。有时它很好。看起来它不是以“交易方式”进行的。因为看起来数据在生成报告时一直在运行。

我很好奇报表是如何执行 SQL 查询的?是一份一份的还是整份的报告?如何调试或查看正在执行的查询?

【问题讨论】:

    标签: oracle oraclereports


    【解决方案1】:

    尝试使用以下查询来检查正在运行的活动 SQl

    select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
    from v$sqltext_with_newlines t,V$SESSION s
    where t.address =s.sql_address
    and t.hash_value = s.sql_hash_value
    and s.status = 'ACTIVE'
    and s.username <> 'SYSTEM'
    order by s.sid,t.piece
    

    【讨论】:

      【解决方案2】:

      Oracle Reports 将根据您的 Oracle Reports 数据模型中它们之间的关系,根据需要发出您的 82 个不同的查询。

      默认情况下,在 Oracle 中,您只能在单个 SQL 语句中获得读取一致性——这就是您的问题。

      例如,假设您有查询 Q_ACCOUNTS(列出您的会计科目表)和查询 Q_JOURNAL_ENTRIES(汇总给定帐户的日记帐分录)。在您的 Oracle Reports 数据模型中,假设 Q_JOURNAL_ENTRIES 链接到 Q_ACCOUNTS。

      在这种情况下,Oracle 报告将运行 Q_ACCOUNTS,然后为每个帐户运行一次 Q_JOURNAL_ENTRIES。这里是关键点:Q_JOURNAL_ENTRIES 的多次执行之间没有读取一致性(就此而言,与 Q_ACCOUNTS 也没有一致性)。

      因此,如果对借方账户 A 和贷方账户 B 进行了会计分录,并且该分录是在 Q_JOURNAL_ENTRIES 为 A 运行之后且在它为 B 运行之前进行的,则您的报告将仅包括贷方 B。并且,因此,您的报告不会累加。

      我从未这样做过,但您可以尝试在“报告前”触发器中运行SET TRANSACTION READ ONLY SQL 命令。这可以为您提供事务级别的读取一致性,这是您所需要的,但它有一些限制(主要是,顾名思义,您不能执行任何数据库写入)。

      【讨论】:

        【解决方案3】:

        也许你可以试试“longops”

        SELECT s.sid, 
               s.serial#,          
               sl.target,  sl.OPNAME, sl.SQL_PLAN_OPERATION as OPERATION, sl.SQL_PLAN_OPTIONS as options,
               ROUND(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed,
               ROUND(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining,
               ROUND(sl.sofar/decode(sl.totalwork,0, decode(sl.sofar, 0,1), sl.totalwork  )*100, 2) progress_pct, s.INST_ID , s.machine
        FROM   gv$session s,
               v$session_longops sl
        WHERE  s.sid     = sl.sid
        AND    s.serial# = sl.serial#(+)
        and sl.elapsed_seconds(+) <> 0
        ORDER BY   ROUND(sl.sofar/decode(sl.totalwork,0, decode(sl.sofar, 0,1), sl.totalwork  )*100, 2) 
        

        【讨论】:

          猜你喜欢
          • 2018-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-16
          • 2020-08-15
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          相关资源
          最近更新 更多