SQL TUNING优化时可大幅提升性能的实战技巧之一

我们进行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条件中有该索引列上的条件;

如果能实现按照索引扫描,性能有成千上万倍的提升也是非常可能的,这点在实践中得到了验证。

时间: 2024-08-02 07:53:36

SQL TUNING优化时可大幅提升性能的实战技巧之一的相关文章

[SQL优化工具]Quest.Central.For.Databases——SQL Tuning for SQL Server

随着企业数据库的急剧膨胀和日益复杂,DBA为保证数据库性能所付出的努力与日俱增,手工或使用多种无法集成的管理工具,都会给日常管理和维护带来不必要的困难. Quest Central for Databases 是一种集成化.图形化.跨平台的数据库管理解决方案,可以管理异构环境下的 Oracle.DB2 和 SQL server 数据库.Quest Central for Databases 消除了企业IT人员管理多种数据库时面临的技术障碍,提高了IT人员工作效率,改善了数据库性能和数据库应用的可

Sql效能优化总结(续)- sql语句优化篇

今晚继续进行Sql效能问题的分享,今天主要是一些具体的sql优化方法和思路分享,若看过后你也有其他想法,欢迎一起探讨,好了,进入今天的主题. 针对性地对一些耗资源严重的具体应用进行优化 出现效能问题时,首先要做的是什么?这个问题我问过不少同事,有人说凭经验对出问题的sql进行优化,如我们一般说的要合理使用索引,尽量不要使用前面带*号的Like语句,不要再比较操作符前边进行计算或使用函数等等,这些道路都是对的,但经验有时候不一定能解决问题.问题出现时,首先要做的是确定问题点是什么,只有正确的找到问

SQL优化(SQL TUNING)之10分钟完毕亿级数据量性能优化(SQL调优)

前几天.一个用户研发QQ找我,例如以下: 自由的海豚. 16:12:01 岛主,我的一条SQL查不出来结果,能帮我看看不? 兰花岛主 16:12:10 多久不出结果? 自由的海豚 16:12:17 多久都没出结果,一直没看到结果过. 兰花岛主 16:12:26 呵呵.好. 兰花岛主 16:12:39 发下sql和运行计划. 自由的海豚 16:12:55 select n.c1, n.c2,n.c3,n.c4,n.c5 from (select  count(t.c1), t.c1, t.c2,t

SQL优化(SQL TUNING)之10分钟完成亿级数据量性能优化(SQL调优)

前几天,一个用户研发QQ找我,如下: 自由的海豚. 16:12:01 岛主,我的一条SQL查不出来结果,能帮我看看不? 兰花岛主 16:12:10 多久不出结果? 自由的海豚 16:12:17 多久都没出结果,一直没看到结果过. 兰花岛主 16:12:26 呵呵,好. 兰花岛主 16:12:39 发下sql和执行计划. 自由的海豚 16:12:55 select n.c1, n.c2,n.c3,n.c4,n.c5  from (select  count(t.c1), t.c1, t.c2,t.

oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

1.   简单介绍 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套同意DBA捕获和保持随意SQL语句运行计划最优的新工具,这样,限制了刷新优化器统计数据.已有应用改变.甚至数据库版本号升级带来的影响.本文帮助对SPM原理基本了解,并对其性能优化能力进行简要的说明. 2.   SPM原理和机制 Oracle 11g通过一个简单而优雅的方法实施了解决SQL计划意外恶化的一套称为SQL Plan Management(SPM)的新特点.仅仅要用户

Oracle Performance Tuning Overview 翻译(Oracle性能优化概述 自己的中英文比对翻译)

Oracle? Database Performance Tuning Guide 10g Release 2 (10.2) B14211-03 Home Book List Contents Index Master Index Contact Us Previous Next PDF · Mobi · ePub 1 性能优化概述 This chapter provides an introduction toperformance tuning and contains the follow

Mysql性能优化----SQL语句优化、索引优化、数据库结构优化、系统配置优化、服务器硬件优化

一.SQL语句优化 1-1.MySQL慢日志 1).慢日志开启方式和存储格式 如何发现有问题的SQL? 使用Mysql慢日志对有效率问题的SQL进行监控 前期准备 mysql> show variables like '%log_queri%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_no

ORACLE性能优化之SQL语句优化

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合理应用Hints 4.  索引及应用实例 5.   其他优化技术及应用 1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的查询语句转

数据库性能优化之SQL语句优化

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索