暂无图片
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
打赏 0
单继博

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

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

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

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

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

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

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

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

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

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

ALTER SESSION SET "_push_join_predicate" = FALSE; 

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

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

我查了下:

         inner join zdpzwcb c

            on c.hshh = b.ZMATERIELCODE

           and a.subbh = c.subbh

好像是在这里;

能再具体给讲讲么?

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

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

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

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


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

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

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


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

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

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

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

老师,还在吗;

我还有个问题;

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

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

不是很理解;

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

也不好都hint;


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

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

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

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

好的;非常感谢;

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


请输入正文
提交
相关推荐
为什么查询语句在SQL server中执行,在oracle中不能执行?
回答 1
函数不一样
请教一SQL(Oracle数据库)
回答 3
已采纳
你可以使用Oracle的MODEL子句来实现这个需求。MODEL子句允许你使用一种类似于电子表格的方式来处理数据。以下是一个可能的解决方案:sqlSELECT  FROM&nbsp
oracle ADG 搭建过程中可以限流吗?
回答 2
已采纳
如果是通过duplicate,可以通过限制rman通道数限制速度。如果是rman备份到本地,再拷贝过去的方法,可以在allocatechannel、configurechannel命令中指定参数rat
Oracle DG开启日志应用
回答 3
已采纳
开启日志应用,备库会向主库发起redo和归档的请求,网络异常或者归档缺失可能会导致这个gap。gap表示的是备库和主库应用日志缺失,开启日志应用肯定会检查这些,备库写到哪,就需要在主库中拿以这个起始点
Oracle外键是否应该加索引?
回答 5
已采纳
Oracle外键不加索引是导致死锁的一个最主要的原因。这是因为,无论是更新父表主键,还是删除父表中的记录,都会在子表上加一个表锁(在这条语句完成前,不允许对子表做任何修改)。这会导致大量的数据被锁住,
Rman catalog start with比较慢
回答 5
首先你既然只是用控制文件存储了备份信息,而没有使用catalog库,那么实际上在恢复的时候,是不需要做catalogstartwith操作的,难道直接listbackup里面没有你想恢复的备份集吗?对
oracle在创建表空间,如果没有给表空间指定路径,一般默认路径在什么哪里?
回答 1
已采纳
看你是用的本地存储还是ASM,如果是本地存储,默认会放到$ORACLEBASE/oradata/sid/路径下。如果是ASM,在安装时会指定一个默认磁盘组来存放表空间。
主备的切换,主库在跑的job,而且是实时跑的。当把备库切换成主库? 新的主库job会继续跑吗?
回答 4
新主库job到点自然会跑,不确定的话自己搭个简单的job验证一下呗
国产数据库排名
回答 2
求大神指导一下。
oracle19c只有一个表空间3T,求拆分方法
回答 2
已采纳
首先需要明确的是,拆分的目的,为什么要拆分?是做业务隔离?表与索引空间拆分?表空间存储参数差异设置?数据文件存储分离?根据不同需求进行不同方式的拆分。