SQL优化实战:让查询沿着索引扫描以提升性能
创作时间:
作者:
@小白创作中心
SQL优化实战:让查询沿着索引扫描以提升性能
引用
CSDN
1.
https://blog.csdn.net/weixin_40345397/article/details/140650885
在处理大量数据集排序并取前N条记录的场景中,SQL优化是一个常见的挑战。本文将通过具体的SQL语句和执行计划对比,深入探讨如何让查询沿着索引扫描,以显著提升性能。
问题背景
在数据库查询中,经常需要对大量数据集进行排序,然后从排序后的集合中取前部分结果。按照常规思路,系统会先读取所有符合条件的数据,然后进行排序,最后取出极少量结果。这个过程中,大量数据的扫描读取、过滤、排序会消耗掉大量的系统资源,导致SQL性能问题。实践中,几分钟乃至几个小时不出结果的情况很常见。
为了优化这种场景的SQL,我们经常会让查询顺序扫描建在排序列上的索引,以避开大量的数据读取和排序。但是,当索引列不在条件中出现时,Oracle数据库不会产生扫描索引的计划,即使使用hint也不能让查询沿着目的索引扫描。
问题重现
我们创建一个简单的表t1并为其添加索引:
create table t1(c1 int,c2 char(10));
create index idx1_t1 on t1(c1);
然后尝试以下SQL查询:
select * from (
select * from t1 order by c1
) where rownum<6;
这个查询的执行计划如下:
从计划中可以看出,系统会先读取表,再进行排序,然后取前5条记录。
尝试优化
如果我们尝试使用hint来强制让查询沿着索引扫描:
select /*+ index(t1,idx1_t1)*/* from t1 where rownum<6;
但是,执行计划显示并没有按照hint的指示执行:
这说明Oracle优化器认为在这种情况下走索引比全表扫描效率更低,因此即使使用hint也会被忽略。
解决方案
为了解决这个问题,我们可以在where条件中添加一个对索引列的条件,即使这个条件看起来是多余的:
select /*+ index(t1,idx1_t1)*/* from t1 where rownum<6 and c1<>-1;
修改后的执行计划如下:
从计划中可以看出,这次查询确实按照索引扫描的方式执行了。
总结
通过这个案例,我们可以总结出优化类似场景的两个关键点:
- 排序列上存在索引;
- where条件中有该索引列上的条件;
如果能实现按照索引扫描,性能提升可能达到成千上万倍,这一点在实践中得到了验证。
热门推荐
养老保险个人账户余额查询如何计算累计利息
《邪不压正》:你懂不懂电影,都不一定懂姜文
甲辰大运遇甲辰流年怎么样,甲辰大运对什么人好
5元以下低价股值得买吗?几个挖掘牛股的小窍门
银行储蓄产品的复利计算方式详解
iOS 17闹钟失灵怎么办?这些解决方案或许能帮到你
梅州十大特色美食,鲜香味美,快来看看你尝过哪些!
运动中正确饮水方法
医院怎么检查过敏源
什么是存储缓存?云中的优势、类型和缓存
小程序开发需要什么知识和技术?
自助餐应该怎么吃?六个科学的取餐顺序让你吃得健康又尽兴
双线怎么确定?怎样有效利用双线进行分析?
五事七计指什么
坐飛機耳壓怎麼解決?
20万买合资燃油车,这五款闭眼选,轻松不踩坑
筷子是怎么演变而来的?在古代筷子有什么象征意义?
工厂如何进行颜色管理
榴莲的最佳食用时间与技巧:让你享受水果之王的美味体验
KNN分类算法的MATLAB实现以及可视化
使用 iPhone 上的屏幕距离功能保护你的眼睛健康
入夏后吃7天这个“正阳果”,若能不上火,必补元气
奥匈帝国原来也是欧洲大国,为什么分裂为无数小国,消失在历史长河中?
唐玄宗接手的唐朝是一个盛世 最后为什么还会出现安史之乱
什么是汇款手续费?一文详解汇款手续费的定义、构成与计算方法
探秘硬币制造背后的科技与艺术:解读无剪辑的创意魔术
老北京炸酱面制作教程:从食材准备到成品详解
颈椎病导致后背痛和肩膀痛手麻应如何锻炼
白细胞偏高会怎么样?五种可能的健康后果
天印公园:南京自然美景与休闲娱乐的最佳去处