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条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
热门推荐
第二次世界大战:1941年之前与1945年之后
中国十大战略要地:它们才是国家安全的关键防线
星盘中土星代表什么:象征意义与生活影响
工资、社保、个税不在同一公司,违法吗?
智能悬浮吊:革新传统吊装设备,提高工作效率与精准度
网络文化中的“梗”:幽默、共鸣与社交互动的新语言
钢材Q235A、Q235B、Q235C、Q235D的区别是什么?
Excel中按某一列排序的多种方法
风力发电并网系统的控制和优化策略
拒绝华强北翻新iPhone,掌握这些iPhone验机技巧不踩雷!
金融风控的架构
如何提高英语听力?
如何进行股票交易中的汇率计算?汇率对股票交易有哪些具体影响?
鸡精和味精的区别:从成分到使用场景的全面解析
提升心理韧性 收获幸福生活
如何突破内心的限制实现自我突破:冲破薄膜的挑战与成长之路
牙齿美白常用的材料有哪些?了解不同材料的美白效果与选择指南
关羽为什么这么重视襄樊?如果他攻下襄樊又会是什么后果?
冬季涮羊肉制作心得:美味与温暖的完美结合
空调挡风板有必要买吗?使用场景与选购指南
第二次工业革命时期,德意志帝国机器制造业的发展及意义
医院自助缴费一体机怎么用电子医保卡
Steam游戏迁移遇到"磁盘写入错误"?这个解决方案帮你轻松应对
湄公河惨案详细解读:13名中国船员遇害,四国警方联合行动
21世纪物理天空最醒目的两朵乌云
岳飞仅存于世的三首词,首首经典,千古传诵
初中英语自学能学好吗?过来人真实经历告诉你
八字流年看桃花-八字流年看感情状况运势
攀上建筑史研究的学术高峰——梁思成的中国古建筑调查
以圆明园牡丹布局一张图揭雍正如何利用乾隆夺下皇位!