Oracle 11g PL / SQL查询背靠背运行,结果不同(不返回所有行)

时间:2014-06-10 15:56:38

标签: sql oracle select oracle11g

因此,如果我在同一个数据库上背靠背运行查询,我会检索不同的结果。查询中的任何内容都不会更改,数据库中的任何内容都不会更改,并且行总是在那里。我通常在当天的第一个查询中注意到这一点,然后继续向下显示其余的行。有什么想法吗?我已经做了好几天了,但没有运气。

版本:Oracle Database 11g企业版11.2.0.1.0版 - 64位生产

我不认为问题是查询,但我想将其包含在内以帮助隔离。

SELECT stuff
FROM   datamartdbo.position_details e10010
       INNER JOIN datamartdbo.fund_master e10002
          ON (e10010.dmart_fund_id = e10002.dmart_fund_id)
       INNER JOIN datamartdbo.security_details e10013
          ON (    e10010.security_alias = e10013.security_alias
              AND e10002.effective_date = e10013.effective_date
              AND e10013.security_id NOT LIKE 'INTEREST ON CASHUSD%'
              AND e10002.snapshot_id = e10013.snapshot_id)
       LEFT OUTER JOIN
       (SELECT   fm.entity_id,
                 t.security_alias,
                 SUM (t.security_gain) - SUM (t.security_loss) tgainloss
        FROM     datamartdbo.fund_master fm
                 JOIN datamartdbo.trade_details t
                    ON fm.dmart_fund_id = t.dmart_fund_id
        WHERE        t.dmart_currency = 'BASE'
                 AND fm.entity_id IN (' an ENTITY ID here')
                 AND fm.effective_date BETWEEN 'Start DD-MON-YYYY'
                                           AND 'End DD-MON-YYYY'
        GROUP BY fm.entity_id, t.security_alias) gl
          ON     e10002.entity_id = gl.entity_id
             AND e10010.security_alias = gl.security_alias
WHERE      e10010.dmart_currency = 'BASE'
       AND (e10010.mkt_val <> 0 OR UPPER (e10013.investment_type) = 'FUTURES')
       AND e10010.local_book_value IS NOT NULL
       AND e10002.entity_id IN ('an ENTITY ID here')
       AND e10002.effective_date = 'End DD-MON-YYYY'
       AND e10002.snapshot_id = 'DEFAULT'

2 个答案:

答案 0 :(得分:0)

您很可能正在查看较大结果集中的行子集。当ORACLE将结果发送给客户端时,它会在通道(可以配置)中执行此操作,如100,1000,10000条记录。

我的猜测是你首先看到(或者前几个)这样的动作并看到它们在跑步之间存在差异。如果你获取整个结果集,你可以检查它们并看到它们是相同的,但是当没有设置ORDER BY时,ORACLE可以按任何顺序自由地检索记录。

尝试添加ORDER BY构建,我希望它能解决问题。

答案 1 :(得分:0)

我猜Oracle优化器的行为有所不同。 您可以使用提示,例如 - NO_MERGE, 或尝试使用WITH(materialize,inline)而不是子查询