一次利用位图索引进行SQL优化的案例
最近用户报告某操作极为耗时,经查,是取一个较复杂的视图的记录数引起的,相应select语句及视图定义类似于:
select count(*) from my_view;
create or replace my_view
as select
tab1.ID, tab1.f1, tab1.f2,
tab2.f3, tab2.f4,
tab3.f5, tab3.f6
from tab1
left join tab2 on tab1.ID=tab2.ID
left join tab3 on tab1.ID=tab3.ID
where tab1.FLAG<>1;
三个表tab1, tab2, tab3的主键均为ID,其中tab1的字段FLAG只有0,1,2等有限个值。当三个表的数据达到2000万级时,耗时在100s以上。分析执行计划,发现因为有了条件“tab1.FLAG<>1”,而需要执行对tab1的全表扫描。
考虑到FLAG的情况,首先在其上创建了一个位图索引以期进行优化。但不幸的是,FLAG=0的记录大约占全部记录的98%以上,FLAG=1的情况不足1%,导致优化器根本不考虑使用该位图索引。
在进行多次尝试之后,终于找到一种方法实现了优化的目标。修改视图定义如下:
create or replace my_view
as select
tab1.ID, tab1.f1, tab1.f2,
tab2.f3, tab2.f4,
tab3.f5, tab3.f6
from tab1
left join tab2 on tab1.ID=tab2.ID
left join tab3 on tab1.ID=tab3.ID
where tab1.ID NOT IN (select ID from tab1 where FLAG=1);
再查看select count(*) from my_view的执行计划,不再有tab1的全表扫描,并且已经利用上了刚创建的位图索引。在2000万级的情况下,用时约为2.1s。用户对此表示认可,问题解决。
再进一步延伸,对于不支持位图索引的数据库(如MySQL),可以另建一张小表存储FLAG=1的记录,再将视图定义里的条件的子查询改为从该小表取ID即可。
- 记录一次利用Timeline Performance工具进行 React性能优化的真实案例
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 一次帮助网友优化的SQL案例
- 【MySql性能优化二】利用explain进行查询和分析sql语句
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
- 一次帮助网友优化的SQL案例
- 什么是覆盖索引?如何利用索引进行SQL语句优化?
- 优化案例 | CASE WHEN进行SQL改写优化
- SQL性能优化案例:分享一次系统迁移获得的经验
- ML之LoR&Bagging&RF:依次利用LoR、Bagging、RF算法对泰坦尼克号数据集 (Kaggle经典案例)获救人员进行二分类预测——优化baseline模型
- sql语句优化一次进行多条记录的-----插入和修改
- 利用sql对数据库进行分页
- 利用百度贴吧进行网站优化的六个妙招
- 利用多核多线程进行程序优化
- 优化了一次sql
- 利用客户端缓存对网站进行优化
- spark中使用sparksql对日志进行分析(属于小案例)
- IPhone开发工具篇-利用xcode profile和analyze进行性能优化
- 性能优化分析案例---解决SQL语句过度消耗CPU问题