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. linux 启动weblogic的某服务报错

    问题如标题所示, 错误信息主要包括: weblogic.store.PersistentStoreException: [Store:280073]The file store"WLS_DI ...

  2. JQUERY知识总结

    1, 让页面上某一个已存在的SELECT被选中的JQuery写法  $("#test").find("option[value='3']").prop(&quo ...

  3. (转)注意力机制(Attention Mechanism)在自然语言处理中的应用

    注意力机制(Attention Mechanism)在自然语言处理中的应用 本文转自:http://www.cnblogs.com/robert-dlut/p/5952032.html  近年来,深度 ...

  4. JavaScript tasks, microtasks, queues and schedules

    最近做的项目中,涉及到了JavaScript中Promise的用法,于是做了一点测试,发现没有想象中的那么简单,水很深,所以找来N先生(我的Mentor),想得到专业的指导.N先生也不尽知,但N先生查 ...

  5. mysql主从复制问题之主从两端binlog日志不同步解决方案

    主操作: 进入主的数据库查看状态: mysql> show master statusG; *************************** 1. row **************** ...

  6. JQuery面试题答案

    jQuery面试题答案 转自:http://blog.csdn.net/zhangpei_xf/article/details/8822021 一.Jquery测试题 下面哪种不是jquery的选择器 ...

  7. POI中getLastRowNum() 和getLastCellNum()的区别

    hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1

  8. 【freemaker】之获取xml的值

    测试代码 @Test public void test09() throws Exception{ root.put("doc", NodeModel.parse(new Inpu ...

  9. hbase shell 基本命令总结

    访问hbase,以及操作hbase,命令不用使用分号hbase shell 进入hbase list 查看表hbase shell -d hbase(main):024:0> scan '.ME ...

  10. Spring @Service生成bean名称的规则

    今天碰到一个问题,写了一个@Service的bean,类名大致为:BKYInfoServcie.java dubbo export服务的配置: <dubbo:service interface= ...