SQL优化实战:让查询沿着索引跑的技巧
创作时间:
作者:
@小白创作中心
SQL优化实战:让查询沿着索引跑的技巧
引用
CSDN
1.
https://blog.csdn.net/weixin_40345397/article/details/140650885
在进行SQL优化时,我们经常会遇到需要对大量数据集进行排序,然后从排序后的集合中取前部分结果的需求。在这种情况下,如果按照常规思路去写SQL,系统会先读取过滤获得所有集合,然后进行排序,再从排序结果中取出极少量结果。这个过程中,大量数据的扫描读取、过滤、排序会消耗掉大量的系统资源,导致SQL性能存在很大问题。实践中,几分钟乃至几个小时不出结果的情况很常见。
为了优化这种场景的SQL,我们经常会让查询顺序扫描建在排序列上的索引,以避开大量的数据读取和排序。但实践中发现,当索引列不在条件中出现时,Oracle不会产生扫描索引的计划,即使使用hint也不能让查询沿着目的索引扫描。
例如:
create table t1(c1 int,c2 char(10));
create index idx1_t1 on t1(c1);
select * from (
select * from t1 order by c1)
where rownum<6;
很明显,这种写法会导致先读取表,再进行排序,然后取前5条记录。其执行计划如下:
如果我们这么写,语义是一样的,但会省去了大量的读取和排序代价:
select /*+ index(t1,idx1_t1)*/* from t1 where rownum<6;
但是,该SQL并没有按照hint指示,顺序扫描idx1_t1索引。个人猜测,可能是Oracle优化器认为过滤条件内没c1列,走索引比走FTS效率更低,所以,干脆就不考虑走索引这种计划,即使使用hint也要忽略,这点感觉有点不尽人意。
那么,我们想什么办法才能让优化器选择扫描idx1_t1的计划呢?我们只需要在where中加个c1列上的条件就可以了,例如:
select /*+ index(t1,idx1_t1)*/* from t1 where rownum<6 and c1<>-1;
修改后的执行计划如下:
由此可见,我们优化类似场景时,只需满足两点:
- 排序列上存在索引;
- where条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
热门推荐
创造历史!郑钦文,冠军!
考研,坚持!不放弃!——考生提升信心的心理策略
探索无酒精世界,哪些饮料可以成为佳选?
如何提高本地知识库系统的查询效率与用户体验?
武汉户部巷必吃这10样,老杆子私藏的神仙小吃
央视纪录片《义门陈氏:千古人间义字香》感动亿万观众
在线客服即时响应用户咨询
调理气虚:从饮食、作息到情绪的全面指南与建议
范阳是现在的什么地方
交通事故赔偿指南:对方全责时如何获取折旧费赔偿?
北斗七星分别都叫什么星?看完涨知识了!建议收藏
空气源热泵:空气-水型PK空气-空气型
分期付款合同签订指南
四川故新教育:如何在研究生考试中脱颖而出!考研成功的秘诀!
编程书籍的优缺点是什么
从技术革新看,苏联在二战中如何应对德军武器优势?
父母之态,子女之态——论父母行为对子女自尊的影响
《哪吒2》辽宁科技馆上映:国内最大IMAX GT巨幕引全国影迷关注
属鼠最富贵的出生日命运揭秘
近50万元现金15分钟找回!旅客:感谢铁路人
全身检查有哪些项目
铸铁地轨安装:技术要求与标准,打造稳固基石
铸铁地轨固定方法详解:从安装到时效处理的完整指南
巨蟹座和狮子座的区别
我国各大城市的区号,是怎么来的
这个排行榜新鲜出炉!长三角6所高校进全球Top200
糖尿病足应该怎么检查
如何分析国际银价的市场表现及其对投资者的影响?国际银价如何影响全球经济状况?
胶原蛋白、透明质酸、植物活性成分对比情况
幼犬成长秘籍:科学喂食,打造健康活力小宝贝