1、表访问方式优化:

a)普通表优先“Index Lookup 索引扫描”,避免全表扫描

大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表扫描”效率要高的多。在编写SQL时,为了保证查询能够使用索引,需要避免出现如下场景:

  • is null 和 is not null

在oracle中null是不能够作为索引的,如果某列数据中有“null”,不要在该列上创建索引,即使创建,也不会提高查询性能。

而在SQL语句中,如果使用is null和is not null,oracle的SQL优化器是不允许走索引的。

  • 前导通配符

在使用like时,出现前导通配符,例如

oracle11代码
SELECT *
FROM
t_sys_conf_midtoresult t
WHERE
t.targettable LIKE
'%mdsp_rpt%'

此时,在targettable上的索引不会生效。

通配符包括'%'和'_'。

  • not

not会导致查询索引不生效。

not的形式有如下几种:

not (fee = 0)

fee <> 0

fee != 0

如果该字段上必须要使用索引,请修改为下列表达方式:

fee > 0 and fee < 0

  • 尽量将表达式放在=号右边

在字段上使用表达式,会导致索引不生效。例如:

oracle11代码
SELECT
*
FROM
t_mdsp_rpt_product_revenue t
WHERE
TO_CHAR(t.dtime,
'yyyymmdd') = '20140701'

一般建议,将表达式放到=号右边,左边字段名称上不要添加任何表达式。例如:

oracle11代码
SELECT
*
FROM
t_mdsp_rpt_product_revenue t
WHERE
t.dtime = TO_DATE('20140701','yyyymmdd')
  • 避免数据类型的隐式转换

在SQL语句中,常见的隐式转换如下:

字符型和数值型比较,Oracle会将字符型隐式转换成数值型;

字符型和date比较,oracle会将字符型隐式转换成date;

隐式转换如果发生在字段上,会造成索引失效。原理同“字段上加表达式”

  • 注意:若避免了上述情况,仍然不走索引,不可轻易的使用hint方式强制走索引,需要根据实际情况具体分析。

b)分区表必须要通过分区键检索部分分区,不可全表扫描

在解释计划中,对于分区表的扫描,不可为“partition range all”。

where条件中,一定要加入对分区键列的条件过滤,同样要避免字段上加表达式和隐式转换

  • 对于list分区

一般使用=判断,例如:

oracle11代码
WHERE
dtime = '20140701'
  • 对于range分区

一般使用范围判断,例如between ... and ...或者>、<、>=、<=等

c)分区表上的索引一般使用本地索引

需要注意的原则与普通表上的索引一致。

在查询分区表时,Oracle先通过分区键找到需要查询的分区,在分区内部使用本地索引进行检索。

2、表连接方式优化

a)NESTED LOOPS(嵌套循环NL)优化,在内部表关联字段上创建索引

最常见的表连接方式,连接原理如下:

从外部表(驱动表)中获取第一条数据,去内部表中查询匹配,若匹配到则输出。

取第二条数据匹配,直到外部表数据遍历一遍。

在CBO下,Oracle自动选择数据量较小的表(或者子查询结果集)作为内部表。

在内部表上创建索引,提高每次检索的效率。

b)Hash Join

在绝大多数场景下,Hash Join是效率最高的连接。

一般用于大表和小表的连接,在小表数据能够全部放到内存中时,效率最高。

c)排序合并连接(Sort Merge Join (SMJ))

它的出现必然伴随着排序操作,效率较低,在Oracle 10g版本以后基本不会出现,若出现,需要确认是否在子查询中是否使用了不必要的排序。

d)CARTESIAN JOIN(笛卡尔连接)

这个就不用多说了,必须要避免的。

3、运算方式优化

避免出现不必要的sort和sort
group by,一般SQL中只在最终输出结果时进行排序,内部子查询不排序。

Oracle SQL优化一(常见方法)的更多相关文章

  1. Oracle 性能优化的基本方法

    Oracle 性能优化的基本方法概述 1)设立合理的性能优化目标. 2)测量并记录当前性能. 3)确定当前Oracle性能瓶颈(Oracle等待什么.哪些SQL语句是该等待事件的成分). 4)把等待事 ...

  2. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  3. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

  4. Oracle SQL 优化原则(实用篇)

    由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...

  5. 【重磅干货】看了此文,Oracle SQL优化文章不必再看!

    目录 SQL优化的本质 SQL优化Road Map 2.1 制定SQL优化目标 2.2 检查执行计划 2.3 检查统计信息 2.4 检查高效访问结构 2.5 检查影响优化器的参数 2.6 SQL语句编 ...

  6. oracle sql优化

    整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2    减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...

  7. oracle sql优化笔记

    oracle优化一般分为:1.sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的) A.oracle的sql语句的条件是从右 ...

  8. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  9. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

随机推荐

  1. c++ 语言细节

    #include <iostream>using namespace std;int main(){     cout << "\nHello World!\n&qu ...

  2. Squid configuration directives 3.0

    WELCOME TO SQUID 3.0.STABLE25-20100412 ---------------------------- This is the default Squid config ...

  3. EF学习笔记——通用增删改查方案

    http://blog.csdn.net/leftfist/article/details/25005307 我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能.以往用 ...

  4. C#里Attribute属性

    系统内置属性 系统内置的Attribute属性Obsolete,被个这属性标记的方法在别的地方被调用的时候会有警告提示; 这个属性还可以指定第二个布尔参数,设置编译时是否报错; 例: [Obsolet ...

  5. WebServiceCaller

    WebServiceCaller /* jonney 2015-09-19 */ using System; using System.Collections; using System.Collec ...

  6. 一台机器运行多个JBoss 4.2.3多实例,或多个同一版

    http://www.java123.net/v/426419.html     暂未验证 今天应用更新,放到测试服务器上打算测试.测试服务器上有个jboss4.2.3有项目在跑,我是功能改造又不想影 ...

  7. mysql 的 infobright 数据库的 mediumblob 显示不了数据

    需要修改mysql的配置文件: /var/www/html/phpmyadmin/config.inc.php 增加: $cfg['ProtectBinary'] = FALSE; 即可

  8. Hbase客户端API基础小结笔记(未完)

    客户端API:基础 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无 ...

  9. C预处理和C库

    #include <stdio.h> #define MAN(x) "n"##x int main(void) { printf("%s",MAN( ...

  10. 57. Jump Game && Jump Game II

    Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...