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. 排序算法总结(三)选择排序【Select Sort】

    一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...

  2. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  3. App_Offline.htm 功能

    在ASP.NET 2.0 站点根目录下,只要存在 App_Offline.htm 文件,那么所有对.aspx的请求都将转向App_Offline.htm .而且浏览器的地址栏显示的是所请求的.aspx ...

  4. Python error: ascii’/'utf-8′ codec can’t decode byte 0xb8 in position 50: ord

    字符串使用了费ascii编码的字符,也就是它代表的16进制的编码超过127. 解决这个问题可以使用下面的方法解决,其实就是设置默认的编码.python 2.x的默认编码是ascii,如果改为utf-8 ...

  5. Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址?

    Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址? 访问URL:  http://localhost:8090/firstapp/login 在eclipse集成的 ...

  6. 正则匹配<{$vcode}>变量

    $title="<{t}>您的验证码是:<{/t}><{$vcode}>,<{t}>请在注册页输入验证码并完成注册:验证码<{$vcod ...

  7. 黄聪:Wordpress二级域名共享用户cookie出现错误解决方案及WP的Cookie机制

    在若干年以前,我刚开始折腾Wordpress没多久的时候,就自己摸索过 多个Wordpress网站共享一份数据表的实现方法 .这种看起来好像很高大上的类SSO功能,能够给用户在多个网站之间提供快速.无 ...

  8. Happen-before

    http://blog.csdn.net/ns_code/article/details/17348313

  9. rsync+sersync实现文件实时同步

    前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...

  10. nodejs初探(二)第一个nodejs程序“hello world”

    直接用文本编辑器编写helloworld.js,保存在桌面 var http = require("http"); http.createServer(function(reque ...