前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次利用位图索引进行SQL优化的案例

一次利用位图索引进行SQL优化的案例

作者头像
星哥玩云
发布2022-08-18 15:48:32
3030
发布2022-08-18 15:48:32
举报
文章被收录于专栏:开源部署

最近用户报告某操作极为耗时,经查,是取一个较复杂的视图的记录数引起的,相应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即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档