因此,如果我在同一个数据库上背靠背运行查询,我会检索不同的结果。查询中的任何内容都不会更改,数据库中的任何内容都不会更改,并且行总是在那里。我通常在当天的第一个查询中注意到这一点,然后继续向下显示其余的行。有什么想法吗?我已经做了好几天了,但没有运气。
版本: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'
答案 0 :(得分:0)
您很可能正在查看较大结果集中的行子集。当ORACLE将结果发送给客户端时,它会在通道(可以配置)中执行此操作,如100,1000,10000条记录。
我的猜测是你首先看到(或者前几个)这样的动作并看到它们在跑步之间存在差异。如果你获取整个结果集,你可以检查它们并看到它们是相同的,但是当没有设置ORDER BY时,ORACLE可以按任何顺序自由地检索记录。
尝试添加ORDER BY构建,我希望它能解决问题。
答案 1 :(得分:0)
我猜Oracle优化器的行为有所不同。 您可以使用提示,例如 - NO_MERGE, 或尝试使用WITH(materialize,inline)而不是子查询