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条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
热门推荐
鸣潮卡池及抽卡资源详解
痰黄粘稠咳嗽时可选用的五种药物
中国心梗日:牢记2个120能救命 心梗前兆需知晓
羊肉的多种美味做法与烹饪技巧分享,让你轻松享受美食盛宴
虫草对心脑血管疾病有好处吗
自媒体,依旧是普通人赚钱的捷径!
海上光伏:漂浮式电站的主战场
云太医互联网医院周立华教授:以整体论治,探索心脑血管健康之路
澳元强势迷局:何时出手?一文揭晓
如何解读八字命局中的十神组合及其影响
怎么举报网贷高利贷有效
中科院心理所"证书"被国务院点名整改,市面上这些心理咨询证书也需警惕!
Go Ratings世界围棋棋手排行榜:申真谞稳坐榜首,柯洁有望成“九冠王”
施工准备全攻略:项目启动前的必要步骤与关键要点
牛肉里面含有嘌呤吗?痛风患者能否吃牛肉?
上市前公司需要进行哪些审计
DeepSeek“爆火”之下,AI如何赋能生命科学产业?
婴儿惊厥怎么治疗
热管理技术全面剖析:掌握散热核心,解锁行业应用秘诀
周公解梦:车辆预示着什么揭秘梦中的车辆象征意义
布洛伪麻片效果好吗 布洛伪麻片和布洛芬一样吗
《黄帝内经》中的四季养生原则:春生夏长,秋收冬藏
营养师解构手脚冰冷12大成因 恐患4类病征兆 保暖要喝咖啡/茶?
拍照时怎样运用光线和角度提升照片质量?
江门失业金每月发放时间多久?2024失业金每月几号到账?
140平方米的户型,算大平层吗?多大面积才算?
怎么管理项目中的sql脚本
跑马人必看:做好这三点,减少运动性心脏疲劳
秦始皇痴迷的“仙药”到底是啥?不但不能长生不老,还含有毒性
张仲景:调理脾胃虚弱方子——枳术丸,调节脾胃气机升降平衡!