Oracle SQL优化一(常见方法)
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时,出现前导通配符,例如
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
- 尽量将表达式放在=号右边
在字段上使用表达式,会导致索引不生效。例如:
*
FROM
t_mdsp_rpt_product_revenue t
WHERE
TO_CHAR(t.dtime,
'yyyymmdd') = '20140701'
一般建议,将表达式放到=号右边,左边字段名称上不要添加任何表达式。例如:
*
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分区
一般使用=判断,例如:
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优化一(常见方法)的更多相关文章
- Oracle 性能优化的基本方法
Oracle 性能优化的基本方法概述 1)设立合理的性能优化目标. 2)测量并记录当前性能. 3)确定当前Oracle性能瓶颈(Oracle等待什么.哪些SQL语句是该等待事件的成分). 4)把等待事 ...
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
- 【重磅干货】看了此文,Oracle SQL优化文章不必再看!
目录 SQL优化的本质 SQL优化Road Map 2.1 制定SQL优化目标 2.2 检查执行计划 2.3 检查统计信息 2.4 检查高效访问结构 2.5 检查影响优化器的参数 2.6 SQL语句编 ...
- oracle sql优化
整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...
- oracle sql优化笔记
oracle优化一般分为:1.sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的) A.oracle的sql语句的条件是从右 ...
- Oracle SQL优化器简介
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
- Oracle SQL优化原则
原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...
随机推荐
- 排序算法总结(三)选择排序【Select Sort】
一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...
- Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference
Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...
- App_Offline.htm 功能
在ASP.NET 2.0 站点根目录下,只要存在 App_Offline.htm 文件,那么所有对.aspx的请求都将转向App_Offline.htm .而且浏览器的地址栏显示的是所请求的.aspx ...
- Python error: ascii’/'utf-8′ codec can’t decode byte 0xb8 in position 50: ord
字符串使用了费ascii编码的字符,也就是它代表的16进制的编码超过127. 解决这个问题可以使用下面的方法解决,其实就是设置默认的编码.python 2.x的默认编码是ascii,如果改为utf-8 ...
- Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址?
Spring mvc创建的web项目,如何获知其web的项目名称,访问具体的链接地址? 访问URL: http://localhost:8090/firstapp/login 在eclipse集成的 ...
- 正则匹配<{$vcode}>变量
$title="<{t}>您的验证码是:<{/t}><{$vcode}>,<{t}>请在注册页输入验证码并完成注册:验证码<{$vcod ...
- 黄聪:Wordpress二级域名共享用户cookie出现错误解决方案及WP的Cookie机制
在若干年以前,我刚开始折腾Wordpress没多久的时候,就自己摸索过 多个Wordpress网站共享一份数据表的实现方法 .这种看起来好像很高大上的类SSO功能,能够给用户在多个网站之间提供快速.无 ...
- Happen-before
http://blog.csdn.net/ns_code/article/details/17348313
- rsync+sersync实现文件实时同步
前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...
- nodejs初探(二)第一个nodejs程序“hello world”
直接用文本编辑器编写helloworld.js,保存在桌面 var http = require("http"); http.createServer(function(reque ...