暂无图片
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
打赏 0
于志君

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

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

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

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

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

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
龙蜥系统上安装 Oracle11G 的,哪个版本稳定点?
回答 4
建议升级到Oracle19c
Windows环境RMAN备份脚本报错问题
回答 10
已采纳
修改日期格式之后一点问题没有啊,你命令行里面的百分号是不是中文百分号,手打英文%上去试试
从oracle迁移数据到达梦数据库,原oracle FLOAT类型数据是两位小数,到达梦数据库FLOAT不一样,怎么解决?
回答 2
已采纳
建议用number(m,n)oracle中也是不建议用float的
Oracle RAC+DG在备库不建库情况下,为什么ASM不能创建文件?
回答 2
最好贴个图上来,asm里面就没有touch或者create命令,所以不能创建普通文件。
ogg配置ddl复制,遇到以下问题,怎么破?
回答 2
看你这个出错是登录oracle的出错。你先在ogg这机器上netmgr看看tnsname的对不对,测试一下。再tnsping一下。最后在sqlplus尝试一下,都可以了再进行ogg的抽取和投递。
32473172 补丁
回答 1
链接:https://pan.baidu.com/s/1uO1U93aLhkV5lvyqu4LO9g?pwdm92f提取码:m92f复制这段内容后打开百度网盘手机App,操作更方便哦7天有限
单机MySQL数据库怎么做成分布式数据库集群?
回答 2
要用分布式中间件,墨天轮里面有个国产数据库易鲸捷的你看下,他们开源的产品应该叫dble,基本都是类似架构的。
优化SQL语句
回答 1
首先,确认统计信息是否准确其次,如果统计信息正确,那么给出这些表的大小,以及几个重要过滤条件单独执行时获取的数据量,例如zb.djrq&gt;‘20200626’andzb.djrq&lt;‘2020
oracle
回答 1
已采纳
参考一下:https://www.modb.pro/doc/110104
如何递归查询到每个组织的跟节点
回答 3
我有两个方法。一个是向上查的。一个是向下查的。你用向下查的啊。