Oracle数据库两次查询结果不一致,是索引问题吗?该信任哪个结果?
你应该优先信任Query2的查询结果,原因如下:
- Query2的过滤条件使用主键id,Oracle的主键会自动创建全局唯一B+树索引,查询时会直接通过主键索引精准定位到对应数据行读取存储的真实值,结果可靠性是100%的,不会出现逻辑匹配错误。
- Query1的过滤字段premiumYn没有索引,对5亿行的大表来说会触发全表扫描,出现结果不一致通常有以下几种常见原因:
- 两次查询的间隔期内有已提交的事务,将id为12345678、34567890的行的premiumYn值从Y更新为N,Query1拿到的是更新前的结果,Query2拿到的是更新后的最新值
- 大表全表扫描默认会开启并行查询,部分Oracle版本存在并行查询相关的bug,会导致WHERE条件过滤失效,返回不符合条件的行
- 查询的user表实际是同义词/视图,指向的对象和你预期不一致,导致查询结果异常
你可以按以下步骤排查问题根因:
- 用闪回查询验证Query1执行时间点的行数据,确认是否发生过数据变更:
SELECT id, premiumYn FROM user AS OF TIMESTAMP TO_TIMESTAMP('替换为你执行Query1的时间,格式如2024-01-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE id IN (12345678,23456789,34567890);
- 查看Query1的执行计划,确认扫描方式、是否开启并行、访问的表是否正确:
EXPLAIN PLAN FOR SELECT id FROM user WHERE premiumYn='Y'; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
- 手动关闭并行后重新执行Query1,对比返回结果是否正常:
SELECT /*+ NO_PARALLEL(user) */ id FROM user WHERE premiumYn='Y';
内容的提问来源于stack exchange,提问作者pitachips
相关产品推荐
相关产品推荐

