SQL优化(SQL TUNING)可大幅提升性能的实战技巧之一——让计划沿着索引跑
2015-04-29 14:17
786 查看
我们进行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的执行计划如下:
大家可以看到,该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;
这么修改后的计划如下:
由此可见,我们优化类似场景时,只需满足两点:
1、排序列上存在索引;
2、where条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
但实践中发现,当索引列不在条件中出现时,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的执行计划如下:
大家可以看到,该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;
这么修改后的计划如下:
由此可见,我们优化类似场景时,只需满足两点:
1、排序列上存在索引;
2、where条件中有该索引列上的条件;
如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。
相关文章推荐
- SQL调优(SQL TUNING)之远程支持完成性能大幅优化
- 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上
- 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上
- 有史以来性价比最高最让人感动的一次数据库&SQL优化(DB & SQL TUNING)——半小时性能提升千倍
- SQL调优(SQL TUNING)之远程支持完成性能大幅优化
- Oracle SQL性能优化技巧大总结
- 【性能优化案例】执行计划宁可走全表扫描,也不走索引
- sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)
- SQL创建索引优化性能
- 分享五个PHP7性能优化提升技巧
- [SQL]提升SQL执行效率诀窍3-索引和调试技巧
- Oracle SQL性能优化技巧大总结
- SqlServer性能优化用SQL(二)【索引监控】
- 优化 SQL Server 查询性能----分析执行计划,索引与索引视图,如何识别要优化的查询
- inq to sql性能优化技巧
- SQL索引优化3(10条SQL技巧)
- FireFox 继续优化 JS处理性能再度大幅提升
- Oracle SQL性能优化技巧大总结
- SQL优化(SQL TUNING)之10分钟完成亿级数据量性能优化(SQL调优)
- Mysql性能优化案例研究 - 覆盖索引和SQL_NO_CACHE