暂无图片
sql优化
我来答
分享
枫叶
2019-06-28
sql优化

参考附件sql;

程序中关联到 ORGANIZATION 表,sql运行就比较慢;

文档中标黄色处,运行正常;标绿色处,运行非常慢;

在绿色处,select code from ORGANIZATION  where guid = '002' 如果修改为:select guid from ORGANIZATION  where guid = '002'

则非常快;

ORGANIZATION 表记录数量为800条;表大小为380K;表的统计信息也是最新的;

ORGANIZATION表 只有code和guid两个独立的唯一索引;两个字段为字符型;

sjzls.subfhd 表比较大;记录数为4900万;

看看文档中标绿色处的sql,有啥问题没有;怎么进行优化;

我来答
添加附件
收藏
分享
问题补充
12条回答
默认
最新
枫叶
上传附件:TKPROF.docx
暂无图片 评论
暂无图片 有用 0
单继博

标绿色处,替换后,结果集是否有变化,另外,有对应的sql执行计划吗

暂无图片 评论
暂无图片 有用 0
枫叶
上传附件:code.txt
暂无图片 评论
暂无图片 有用 0
枫叶
上传附件:guid.txt
暂无图片 评论
暂无图片 有用 0
枫叶

结果集没有变化;目前code和guid是一致的;将来有可能不一致;所以目前替换是可以的;将来就不好说了;

所以看看为啥code就慢了10倍;在前2处标黄色的地方,替换不替换,都没有影响;就是最后标绿色的地方;替换为guid,直接读索引,就非常快;要是code;就慢了10倍;

附件是cod和guid对应的执行计划;

guid,走的是subfhd的IDX$$_0BDF0003索引;大小是1.5G

code,走的是subfhd的index6索引;大小是2.1G

暂无图片 评论
暂无图片 有用 0
文成

两者索引部分走的都是 INDEX UNIQUE SCAN 问题不是这里

试试以下的语句,禁止谓词推入看看效果

ALTER SESSION SET "_push_join_predicate" = FALSE; 

暂无图片 评论
暂无图片 有用 0
枫叶

设置禁止谓词推入后,执行速度快了5倍;

我查了下:

         inner join zdpzwcb c

            on c.hshh = b.ZMATERIELCODE

           and a.subbh = c.subbh

好像是在这里;

能再具体给讲讲么?

比如到具体程序sql里面,没法设置这个参数,要怎么修改呢

暂无图片 评论
暂无图片 有用 0
文成

sql 可以添加 /*+ push_join_predicate(c) */  hint 禁止谓词推入

如果进行谓词推入,会将b的记录带入c的视图中进行NESTED LOOPS,进而引起性能问题


暂无图片 评论
暂无图片 有用 0
枫叶

不好意思啊,这个sql子查询比较多,看的我有点乱;

/*+ push_join_predicate(c) */ 这个hint是加到哪里呢?比如在sql的大概哪一行的select后面呢;


另外,其他程序sql,也有很多关联到 ORGANIZATION 表,只要关联到这个表;就慢;

是不是其他程序要具体再分析,是否也是进行了谓词推入?如果是,也都加hint提示?

还有个问题,当初为了排查问题,在文档标绿色的那句sql;换了一个其他表,也提取guid;就非常快;换这个ORGANIZATION 表,就慢;按理说,换成其他表,也会发生谓词推入的情况啊;一会我再测试下,换其他表替代ORGANIZATION 表的效果;

暂无图片 评论
暂无图片 有用 0
枫叶

老师,还在吗;

我还有个问题;

第三处标绿色的地方:select code from ORGANIZATION  where guid = '002'

为啥 select guid from ORGANIZATION  where guid = '002' 这样就没有谓词推入的问题呢;

不是很理解;

因为其他很多程序都用到这段代码;

也不好都hint;


暂无图片 评论
暂无图片 有用 0
文成

可以对比一下两个字段统计信息的情况,是否收集直方图

还可以通过10053 看一下执行计划的判断是否有问题

暂无图片 评论
暂无图片 有用 0
枫叶

好的;非常感谢;

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