前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >案例纠正一则

案例纠正一则

作者头像
bisal
发布2021-09-06 15:36:05
2320
发布2021-09-06 15:36:05
举报

通过索引提升SQL性能案例一则》提到的案例,处理不太准确,有必要纠正下,更要谢谢老虎刘老师的耐心指正。

原始SQL,跑出的执行计划,是INDEX SKIP SCAN,确实是低效的,

代码语言:javascript
复制
select t.AGENT as agent,
        nvl(sum(case
        when t.operation_type = 'A' then 1 else 0 end),0) as
        DflCount,
        nvl(sum(case
        when t.operation_type = 'B' then 1 else 0 end),0) as
        IfCount,
        nvl(sum(case
        when t.operation_type = 'C' then 1 else 0 end),0) as
        AecCount,
        nvl(sum(case
        when t.operation_type = 'D' then 1 else 0 end),0) as
        BsCount        
        from OP_LOG t        
        where 
        t.code  = 'AA'
        and t.ORI_CODE =  'ABC'
        and t.T_DATE BETWEEN to_date('20201209','yyyymmdd') and to_date('20201209','yyyymmdd')
        and IS_VALID = 1
        and t.operation_type in ('A','B','C','D')        
        group by t.agent         
        order by agent;

误区1,agent加到复合索引

因为原打算利用索引有序的特性,将agent加到索引中,利用复合索引(t_code, ori_code, t_date, t_no, agent),避免排序,但实际上,SQL中索引列条件t_date不是等值查询,而是范围查询,对这个复合索引来说,agent还可能是无序的。因此如果遵从“等值条件在前,范围条件在后”的索引构建原则,复合索引不应该加上agent,而可以考虑将operation_type加到索引中,并且放到t_date前。至于is_valid,number类型,长度定义为1,当前值都是1,放到索引access这个值,还是回表filter,我倒是觉得区别不会很大。

误区2,未考虑直方图

表中数据未必都是均匀分布的,尤其像operation_type的值,可能存在差异,因此还是需要看下检索字段的数据分布情况,如果存在倾斜,采集直方图,会对不同的值选择正确的执行计划有所帮助。

从这个案例来看,构建不同的索引,我们得到的优化程度是不同的,但是归根结底,还是需要踏实下来好好了解索引等这些知识的基本原理,结合实际问题,不断纠正自己错误的观念,对我来说,这条路上还是有很多积累和提升的地方。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档