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条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
热门推荐
让律师帮忙调取被告人身份信息的流程是怎样的?
屏幕刷新率是什么意思?刷新率是越高越好吗?
女人结婚为什么要彩礼?深度解析彩礼背后的意义与文化差异
巳时在八字中是什么命
南极科考科研新进展!800多尾珍稀鱼类样品身上藏着什么“秘密”
春节年货知多少:年货大盘点,有你的家乡吗?
如何正确判断节温器?判断节温器时应注意哪些关键步骤和注意事项?
跨栏技术动作解析及其训练方法
缠论中的笔和线段:金融市场技术分析基础
糖尿病怎么查
河蟹养殖方法和环境
如何进行项目成本核算?详细步骤和方法解析
兰姓起源、演变及现代发展
成都中职学校就读如何提升就业竞争力?
抖音发布2024读书生态数据报告,00后最爱看史铁生
债务人死亡后如何追债?一文详解遗产清偿与担保责任
基于AI人工智能大模型的数字化智能工厂建设方案
手臂痠麻手指無力疑似頸椎出狀況 竟是手肘隧道症候群
有限合伙企业设立的条件及合伙人数量
数据结构与算法:贪心算法与应用场景
为什么拥有1.7亿人口的尼日利亚,在国际舞台上几乎毫无存在感?
万亿潜力的科技赛道,2035年或迎可控核聚变“第一度电”!细分龙头牛气冲天
吸入84,喉咙不适几时消?
当归黄芪党参的功效是什么
31句淡雅绝美古诗词,句句轻盈飘逸灵空,闲适小情调堪称灵魂救赎
1升等于多少克——深入解析液体与固体的密度关系
电动汽车的保值率与售后服务相关吗
光影:从物理现象到艺术表现
有限空间作业安全指南:十大关键防护措施
智能家居系统:功能、特点与作用全解析,开启智慧生活新体验