四时宝库

程序员的知识宝库

只需一个联合索引?一条sql就可以由450s减为0.4s?

概述

最近开发说某个接口跑的很慢,排查了下发现其中一条sql,数据量不大,但居然要跑451s,下面简单记录一下优化的过程。


问题sql

SELECT l.location_gid ENUMVALUE, l.location_name DISPVALUE
 FROM servprov s, location l
 WHERE s.domain_name = 'FSL2'
 AND s.servprov_gid = l.location_gid
 AND EXISTS (SELECT 1
 FROM fsl2_fee_split f
 WHERE f.servprov_gid = l.location_gid
 AND start_time > SYSDATE - 60)
 ORDER BY 1 DESC, 2

1、数据量

可以看到只是其中一张表上百万数据,但也不是很大,然后还有两张小表。


2、索引情况

观察大表的索引情况,发现用到了其中一个索引。


3、查看执行计划

用F5看这执行计划没多大问题,也是小表去驱动大表。


4、去掉时间

把这条sql去掉时间的条件发现只需要0.29s。


5、建立索引

考虑去掉之前的索引,建联合索引

create index IND_FEE_SERVPROV_GID2 on FSL2_FEE_SPLIT(SERVPROV_GID,start_time)
 tablespace INDX
 pctfree 10
 initrans 2
 maxtrans 255
 storage
 (
 initial 1M
 next 1M
 minextents 1
 maxextents unlimited
 pctincrease 0
 );
drop index IND_FEE_SERVPROV_GID;

6、测试验证

从451s到0.4s,结果正确,满足需求,先这样了。

执行计划保持不变。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接