案例纠正一则

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

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

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的值,可能存在差异,因此还是需要看下检索字段的数据分布情况,如果存在倾斜,采集直方图,会对不同的值选择正确的执行计划有所帮助。

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

近期更新的文章:

小白学习MySQL - 数据库软件和初始化安装

小白学习MySQL - 闲聊聊

Redis和Sentinel的安装部署和配置

“火线”和“零线”

通过索引提升SQL性能案例一则

如何手动添加jar包到maven本地库?

1元股权转让的一点思考

如何打造一个经常宕机的业务系统?

Linux恢复误删文件的操作

Linux的scp指令使用场景

Oracle处理IN的几种方式

如何搭建一支拖垮公司的技术团队?

IP地址解析的规则

MySQL的skip-grant-tables

国产数据库不平凡的一年

Oracle要求顺序的top数据检索问题

日常工作中碰到的几个技术问题

了解一下sqlhc

Oracle的MD5函数介绍

Oracle 19c的examples静默安装

sqlplus登录缓慢的解决

VMWare 11安装RedHat Linux 7过程中碰到的坑

COST值相同?是真是假?

Oracle 11g的examples静默安装

同名的同义词和视图解惑

v$和v_$的一些玄机

文章分类和索引:

公众号700篇文章分类和索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值