Oracle初级性能优化总结
前言
关于对Oracle数据库查询性能优化的一个简要的总结。 从来数据库优化都是一项艰巨的任务。对于大数据量,访问频繁的系统,优化工作显得尤为重要。由于Oracle系统的灵活性、复杂性、性能问题的原因多样性以及Oralce数据库的动态特性,优化成为Oracle数据库管理中最困难的领域。作为一个对数据库了解不多的程序猿,我也只能从最基本的开始着手,慢慢来学习掌握Oracle的基础吧。
示例
1、避免使用select *
当你想在select字句中列出所有的column时,使用“select *”是一个方便的方法。不幸的是,这是一个低效的方法。实际上,Oracle在解析的过程中,会将‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。
---糟糕的查询
select * from Table_Name1
---较好的查询
select columnname1,columnname2,columnname3 from Table_Name1
2、使用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个column上。这样一来,就可以减少解析的时间并减少那些由column歧义引起的语法错误。
column歧义指的是由于SQL中不同的表具有相同的column名,当SQL语句中出现这个column时,SQL解析器无法判断这个column的归属。
---糟糕的查询
select columnname from Table_Name1 t1,Table_Name2
---较好的查询
select t1.columnname from Table_Name1 t1,Table_Name2
3、用Exists 替代 in
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用exists(或not exists)通常将提高查询的效率。
例子:从小卖部买东西(商品),假如有个库存表Table1,买东西出库表Table2.查找库存中的商品,是否有被卖出的,有的话就输出库存信息。
--糟糕的查询
SELECT column_name
FROM table_name1
WHERE column_name IN
( SELECT column_name
FROM table_name2)
---较好的查询
SELECT column_name
FROM table_name1 outer
WHERE EXISTS
(SELECT
FROM table_name2 inner
WHERE inner.column_name = outer.column_name)
4、用not exists 替代 not in
在子查询中,not in子句将执行一个内部的排序和合并。无论在那种情况下,not in 都是低效的(因为它对子查询中的表执行了一个全表遍历)。为了避免使用 not in ,我们可以把它改写成外连接(outer join)或 not exists。
---糟糕的查询
select columnname,columnname1 from Table_Name1
where id not in(select id from Table_Name2 where name='A')
---较好的查询
select columnname,columnname1 from Table_Name1 t1,Table_Name2 t2
where t1.id=t2.id
and t2.name<>'A'
---更好的查询
select columnname,columnname1 from Table_Name1 t1
where not exists(select from Table_Name2 t2
where t2.id=t1.id
and t2.name='A')
5、用表连接替换Exists
通常来说,采用表连接的方式比Exists更有效率。
但是很多情况下我们无法将Exists改编为连接。
---糟糕的查询
select columnname,columnname1 from Table_Name1 t1
where not exists(select from Table_Name2 t2
where t2.id=t1.id
and t2.name='A')
---较好的查询
select columnname,columnname1
from Table_Name1 t1
join Table_Name2 t2 on t1.id=t2.id
where t2.name='A'
6、用exists替换distinct
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在select字句中使用distinct。一般可以考虑用Exists替换。Exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
例子:从小卖部买东西(商品),假如有个库存表Table_Name1,买东西出库表Table_Name2.查找库存中的商品,是否有被卖出的,有的话就输出库存信息。
--糟糕的查询
SELECT DISTINCT t1.column_name
FROM table_name1 t1, table_name2 t2
WHERE t1.column_name = t2.column_name;
---较好的查询
SELECT column_name
FROM table_name1 outer
WHERE EXISTS
(SELECT
FROM table_name2 inner
WHERE inner.column_name = outer.column_name)
7、用>=替换>
如果id上有一个索引,则:
///糟糕的查询
select * from EMP where id>;
//较好的查询
select * from EMP where id>=;
两者的区别在于,后者将直接跳转到第一个id等于4的记录而前者将首先定位到id=3的记录并且向前扫描到第一个id大于3的记录。
8、用UNION替换OR
通常情况下,用UNION替换where字句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。查询效率可能会因为没有选择OR而降低。
---糟糕的查询
select id,name,reg where Table_Name1 where id= or reg='A'
---较好的查询
select id,name,reg from Table_Name1 t1 where t1.id=
union
select id,name,reg from Table_Name2 t2 where t2.reg='A'
当然以上要基于id列和reg列都是索引列。
9、用UNION-ALL 替换UNION
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序,并将重复记录过滤掉。
如果用UNION ALL替代UNION,这样排序就不是必要了,效率会因此得到提高。
需要注意的是,UNION ALL将重复输出两个结果集合中相同记录,因此还是要从业务需求 分析使用UNION ALL的可行性。
---糟糕的查询,需要进行排序
select id,name,reg from Table_Name1 t1 where t1.id=
union
select id,name,reg from Table_Name2 t2 where t2.id=
---较好的查询,不需要排序
select id,name,reg from Table_Name1 t1 where t1.id=
union all
select id,name,reg from Table_Name2 t2 where t2.id=
考虑的时候一定也要基于业务的需求进行取舍。
10、避免在索引列上使用IS NULL和IS NOT NULL
对于单列索引,如果列包含空值,索引中将不存在此记录。
对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空。则记录存在于索引中。
因为空值不存在于索引列中,所以where子句中对索引列进行空值比较将使Oracle停用该索引。
---糟糕的查询
select id,name,reg from Table_Name1 t1 where t1.id is not null
---较好的查询
select id,name,reg from Table_Name2 t2 where t2.id>=
前提还是id列是索引列
总结
本节暂时总结到这里,之后继续进行总结,感觉还是很有用的,然后在日常的工作中加以实践,应该对自己的能力有所改善。上面总结的都是常规的做法,当然具体优化还要根据具体的环境进行处理,处理方式复杂多变,但万变不离其宗。如有错误,请及时通知加以更正,谢谢。
Oracle初级性能优化总结的更多相关文章
- 原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)
原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(数百篇oracle/teradata性能优化.故障处理原创文章) 858871 top 500 ...
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
- oracle数据库性能优化方案精髓整理收集回想
oracle数据库性能优化整体法则: 一.降低数据訪问(降低硬盘房訪问次数) 二.返回更少的数据(降低网络传输或磁盘訪问) 三.降低交互次数(降低网络传输) 四.降低server开销(降低cpu及内存 ...
- ORACLE SQL性能优化(全)
ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html
- Oracle SQL 性能优化技巧
Select语句完整的执行顺序: SQL Select语句完整的执行顺序: 1. from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将 ...
- 浅谈Oracle数据库性能优化的目标
Oracle性能优化保证了Oracle数据库的健壮性,为了保证Oracle数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略.从数据库性能优化的场景来区分,可以将性能优化分为如 ...
- Oracle SQL性能优化总结
1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...
- Oracle SQL性能优化的40条军规
1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执 ...
- Oracle数据库管理----性能优化
https://blog.csdn.net/yzllz001/article/details/54848513 数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找 ...
随机推荐
- 全键盘操作Windows
计算机机用户在使用计算机的时候,是用键盘多一点?还是用鼠标多一点?如果是专业打字员,应该会说他使用键盘多一点,除此之外,多数人都会告诉你,他已经离不开鼠标了,没有鼠标,就不会操作电脑. 如果某一天 ...
- fhq treap 学习笔记
序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...
- MySQL 实现将一个库表里面的数据实时更新到另一个库表里面
MySQL 实现将一个库表里面的数据实时更新到另一个库表里面 需求描述:MySQL 里面有很多的数据库,这些数据库里面都有同一种表结构的表 (tb_warn_log),这张表的数据是实时更新的,现在需 ...
- SpringBoot中使用纯scala进行开发 配置教程 非常简单的案例
新建项目 建好之后 建一个叫scala的文件夹 并把它标记为root文件夹 修改pom.xml文件 复制粘贴如下内容: 添加的插件的作用,如果不添加,在新建文件的时候右键只能新建java的文件,无法创 ...
- sorted()排序详解
sorted()排序详解 http://wiki.python.org/moin/HowTo/Sorting?highlight=%28howto%29#The_Old_Way_Using_t ...
- 树状数组解决LIS---O(nlogn)
树状数组解决LIS---O(nlogn)之前写过二分查找的LIS,现在不怎么记得了,正好用Bit来搞一波.f[i]表示以a[i]结尾的LIS的长度.t[x]表示以数值x结尾的LIS的长度.即t[x]= ...
- Hive项目开发环境搭建(Eclipse\MyEclipse + Maven)
写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Mav ...
- redis 持久化的两种方式
一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的 莫过于SNAPSHOTTING模 ...
- 高能天气——团队Scrum冲刺阶段-Day 1-领航
高能天气--团队Scrum冲刺阶段-Day 1-领航 各个成员在 Alpha 阶段认领的任务 经过重新的团队讨论,我们最新确定的α版本所需实现内容如下: 查找城市:切换城市按钮.滑动界面视图 天气预报 ...
- 001.NFS简介
一 简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够 ...