暂无图片
oracle的sql优化求助
我来答
分享
刘广
2021-11-23
oracle的sql优化求助
暂无图片 5M

sql文本:

select a.id from tpxx a

select a.id from zp a
inner join tpxx b
on b.id=a.id
where (dbms_log.getLength(a.photo))=0
and b.tion is null;

每次查询结果是0;


A表:1593万   3280GB

B表:650万     1.5GB


请问各位专家,这个SQL有没有办法优化呢?


执行计划及统计信息如下


我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
流星

两表都是全表扫描,看看能否添加合适的索引。符合b.tion is null的记录若占b表中少量的行就创建组合索引(tion,'1'),若占的较多则创建b表的组合索引(tion,id)。对于where (dbms_log.getLength(a.photo))=0,其中的dbms_log包应该是用户自定义的吧,不是数据库自带的吧,要么创建a表的基于用户自定义函数的函数索引 (dbms_log.getLength(a.photo)),要么想办法把这个自定义函数从sql中去掉,再看能否添加合适的索引。

暂无图片 评论
暂无图片 有用 0
暂无图片
刘广
题主
2021-11-23
谢谢专家的解答,由于是老系统且没有开发支撑,只能通过创建索引解决了,SQL暂时改不了
刘广
题主
2021-11-23
创建了函数索引解决了,谢谢专家
薛晓刚

这个要从需求上优化。你目的是什么?看上去要看哪些数据是没有附件(照片)的。

没有过滤条件只能全查了。

建议那么你这一次查询,知道全貌了。那么给这些数据打上一个标记比如0.需要增加一个字段flag。

那么下次再有新增数据或者变更的时候直接计算这个条数据的这个条件。要么是0要么不是。0的就给flag打0,1的就给flag打1.

然后对flag建立位图索引。

你以后查询where条件带上flag就行。

暂无图片 评论
暂无图片 有用 0
刘广
题主
2021-11-23
可以建索引解决吗?这个系统是十几年的老系统,没有开发支撑,现场运维也不知道这个sql是干什么用的
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏