暂无图片
oracle 在sys用户下与普通用户下建相同的表,相同sql语句的执行计划为什么不同
我来答
分享
于志君
2021-08-04
oracle 在sys用户下与普通用户下建相同的表,相同sql语句的执行计划为什么不同

我与客户分别做了一个相同的实验:
create table test2 as select * from dba_objects;
create table test3 as select * from dba_objects;
create index idx_test2_id on test2(object_id);
create index idx_test2_name on test2(object_name,owner);
create index idx_test3_id on test3(object_id);
执行sql语句:
select *
from (select temp.*,rownum rn
from (select object_name,owner from test2 t2 where t2.object_name is not null and exists (select 1 from test3 t3 where t3.object_id=t2.object_id)
order by t2.object_name,t2.owner) temp where rownum<=10) temp1
where rn>0;
发现执行计划是不同的,然后我注意到我用的是scott用户,他用的是sys用户。
scott用户下将rownum<=10推入到内层查询,使用了test2的索引(object_name,owner)进行排序,而sys用户下则进行了全表扫。
执行计划分别如下:
image.png
image.png
用10053跟踪了一下:
sys下子查询展开通过检查,仍然要costing
image.png
scott下将exists转换为join:
image.png
请问:访问属主为sys用户的表与普通用户的表有什么不同吗,执行计划为什么不一样?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
陈举超
暂无图片

1.是否问题可以稳定重现,每次执行都是固定的执行计划?
2.两个用户下表统计信息是否是最新的?
3.是否是RAC环境,每次执行连到了不同的实例?

暂无图片 评论
暂无图片 有用 0
于志君

会稳定重现,每次都是固定执行计划,统计信息都是最新的,非rac环境

暂无图片 评论
暂无图片 有用 0
于志君

而且只跟表的属主有关,因为建了公有同义词后,跟用哪个用户访问没有关系

暂无图片 评论
暂无图片 有用 0
Thomas

今天我试了,好像确实如此。而且给表搜集和分析了统计信息(dbms_stats.gather_table_stats和analyze table compute statistics),依然没变化。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏