暂无图片
SQL优化减少逻辑读
我来答
分享
暂无图片 匿名用户
SQL优化减少逻辑读

该SQL查询如何建索引,从而到达优化该SQL的逻辑读。AU_ORDER T, BA_USER_INFO_T M, AU_ORDER_DETAIL D, BIZCRMDB.BA_MEMBER_INFO_T MI都是上百万和千万的大表, BASEDB.BA_PRODUCT_T只有几千数据。请大师指点一下

SELECT TO_CHAR(NVL(SUM(D.QUANTITY *
(SELECT to_number(AT.standard_tin)
FROM BASEDB.BA_PRODUCT_T AT
WHERE AT.PRODUCT_SKU = D.PRODUCT_SKU
AND AT.COMPANY_ID = T.COMPANY_ID)),
0),
'FM99999990.09999') PURSTANDARDNUM
FROM AU_ORDER T, BA_USER_INFO_T M, AU_ORDER_DETAIL D, BIZCRMDB.BA_MEMBER_INFO_T MI
WHERE T.ORDER_TYPE_DTCODE = 'score'
AND T.ORDER_STATUS_DTCODE = 'finish'
AND D.Order_Detail_Status = 'finish'
AND T.COMPANY_ID = 'X'
AND T.ORDER_USER_ID = M.USER_ID
AND T.COMPANY_ID = M.COMPANY_ID
AND T.ORDER_DT < TO_DATE('20211121', 'YYYYMMDD')
AND T.ORDER_DT >= TO_DATE('20211105', 'YYYYMMDD')
AND T.ORDER_QUANTITY - NVL(T.STRIKE_PRD_QTY, 0) > 0
AND T.ORDER_ID = D.ORDER_ID
AND M.MEMBER_ID = MI.MEMBER_ID
AND MI.COMPANY_ID = M.COMPANY_ID
AND MI.MEMBER_NO = 'XXXXXXX';


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

拆分表,分区表

暂无图片 评论
暂无图片 有用 0
彭君

回表再过滤可以创建符合索引,另外都是大表,返回的结果集多吗,应该走hash才对呀,你可以加hint优化下

暂无图片 评论
暂无图片 有用 0
彭君

预估1行,实际返回那么多,这里有问题呀,收集下统计信息,所以才走了nl

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

 表T,建立复合索引:company_id, order_type_dtcode,order_quantity,ORDER_QUANTITY - NVL(STRIKE_PRD_QTY, 0),order_status_dtcode,order_dt试试 

暂无图片 评论
暂无图片 有用 0
郑楼

AU_ORDER的ORDER_DT索引谓词越界了吧

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

收集个sqlhc看看呢

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

再就是关注一下那个erow和arow比较悬殊的那个表,看看统计信息是否是最新的

暂无图片 评论
暂无图片 有用 0
广州_老虎刘

目前已有的几个建议都不太靠谱,有一个T表建索引的建议比较接近,也有3个比较严重的原则错误(把所有相关字段都加上;非等值条件不在最后;被驱动表,关联字段没有加,这些都是原则性错误)。T表新索引的创建,需要进一步分析T表相关字段的数据分布。

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

没看出来慢,这个不是很快吗?

暂无图片 评论
暂无图片 有用 0
你好我是李白

从执行计划第13步骤A-rows与E-rows差距很大,大概率是楼上说的AU_ORDER的ORDER_DT谓词越界了,收集统计信息一般能先纠正CBO估算错误,然后再生成准确的执行计划,再考虑优化SQL或者索引吧~

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

广州_老虎刘,谢谢夸奖。尽管我的建议也有问题,但毕竟还算是有点靠谱的回答。哈哈

暂无图片 评论
暂无图片 有用 0
不太冷

看T表关键列的数据分布,然后考虑建复合索引

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