`
阅读更多

SQL优化简介
一般在应用中, 糟糕的SQL语句是造成系统性能低下的最主要原因,例如大小写的不统一、同样的SQL语句不同的写法等。而且,随着数据量的增加,情况会变得越来越严重。(题外话:优秀的Oracle数据库优化人才,是任何公司都稀缺的)
  SQL优化又称SQL调节,其步骤一般包括:
 
SQL调节的目标
 
SQL调节包括三大目标:降低负载、均衡负载和并行化负载。
 
l降低负载:即寻找更高效的途径来完成相同的功能
如某个非大表(小于2000万行数据数据或小于2G大小的单表),常规查询需要访问的数据实践中90%情况下是不会超过20%的,此时建立合理的索引是有效的方法之一
l均衡负载:即应该把任务分时段均衡调度
如一般系统白天是访问高峰,如果此时备份任务、批处理任务或报表数据抽取任务也在这个时段则易造成负载峰值现象,正确的做法应该是把备份任务、批处理任务和报表数据抽取任务放到晚上进行处理,或采用并行化策略
l并行化负载:即大数据量的查询访问需要使用并发策略
如在数据仓库环境中应该多使用并发策略,此举可以明显减少响应时间
 
 
SQL优化阶段
  
 
使用OEM发现顶级SQL
  
 
在OEM中,选择性能->其它监视链接->定级活动,如下图:
  
 
不要用*代替所有列名
  
 
指定仅仅需要的列名与使用*对比:
时间:359/1327=27.05%  CUP耗费: 4092121327/6413227637=63.81%
IO耗费: 29601/110117=26.88% 可见大幅降低I/O从而降低响应时间!
 
 
SQL优化技巧
使用TRUNCATE代替DELETE
  Oralce执行DELETE后会使用UNDO表空间存放被删除的信息以便恢复,如果之后用户使用ROLLBACK而不是COMMIT,则Oralce将利用该UNDO表空间中的数据进行恢复。当使用TRUNCATE时,Oracle不会将删除的数据放入UNDO表空间,因而速度要快很多。当要删除某个表中的全部数据时,应该使用TRUNCATE而不是不带WHERE条件的DELETE。语法如下:
 TRUNCATE TABLE table_name [DROP|REUSE STORAGE]
 DROP STORAGE为默认的方式,表示收回被删除的表空间
 REUSER STORAGE表示保留被删除的空间以供该表的新数据使用
 
 应用开发中,可以编写一个子程序让其动态的清除空表,以供调用。
默认PCTFREE为10,假定为5,high-water mark是一个存储段分配多少存储器的标记。
  
 
  
 
 
  
 
活用COMMIT
  PL/SQL块中,经常将几个相互联系的DML语句写在BEGIN …END,如果不影响事务的完整性,则建议在每个END前面写一个COMMIT,以达到 对DML的及时提交释放事务所占的资源的目的。
  COMMIT释放的资源包括:
lUNDO段上用于恢复数据的信息
l事物中DML语句获得的锁
lSGA中重做日志缓冲区中的空间
lOracle为管理相关资源(如上述资源) 而开销的内部资源
体验例子流程如下 
体验例子显示 
 
减少表的查询次数
 
1.一个逻辑单元中,将能读出的列一次性读出,且尽量存放在本地变量中,应该杜绝不要用一个读一个
 
2.在包含子查询的SQL中,要特别注意减少对表的查询次数,在代码清晰时对于能减少查询次数的应坚决减少,举例如下:
2.执行计划如下,结论是什么? 
 
以EXISTS代替DISTINCT
多表信息的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXISTS替换, EXISTS 使查询更为迅速,因为此时RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
 
优化前:
 
优化后:
  
使用默认值
  
使用默认之后的执行时间比为1.063/2.657=40.01%,快了一倍多!
可见在不含默认值,是null的列上没有使用索引,是全表扫描!而使用了默认值的列上使用了索引范围扫描!
 
l不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能
l任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的
l如果每列确实可能存在空值的情况,可以使用默认值的方式替代以便充分利用索引提高性能
 
使用DECODE函数减少处理步骤

 
l使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
lDECODE函数也可以运用于GROUP BY 和ORDER BY子句中.
l上述例子有两步相似的操作,使用DECODE后节省一半时间,如果一组相似的操作越多,节省的时间则越多,计算公式为n-1,其中n为相似操作的步骤数
 
通配符的使用技巧
  
上例中已知数据%DX_ACCOUNT_TRADE%,只有以I开头的
首位使用通配符是首位不使用通配符执行效率的:0.031/1.891=1.639%
 
l当通配符出现在LIKE后面字符串的首位时,索引将不会被使用,因此在已知某字符的情况下,LIKE查询中应尽量不要把通配符写在首位
l%代表不定长的字符,_代表定长的字符,如果在确定要通配的字符长度时,应该尽量使用_,而不是%
 
定义并执行严格的SQL编写规范
 
使用Oracle共享游标的优点是:
l降低和减少Oracle对SQL的解析数量
l动态调整内存
l提高内存的使用率
 
风格请参照前面章节中的“建议的程序风格”
  
表的连接方式 
FROM表顺序选择
  使用基于规则的优化器(CBO)时,Oracle解析器按照从右到左的顺序处理FROM子句的表明,即FROM子句中最后的表(驱动表)会最先被处理。
  当FROM子句包含多个表时,建议将记录最少的表(一般是字典表)放在最后面。当Oracle处理多个表时,一般采用排序或合并的方式连接这些表,系统首先会扫描FROM子句部分的最后一个表,并对该表的数据行进行排序;然后扫描倒数第二个表,并将从该表中取出的记录与第一个表中的记录进行匹配合并,依此类推。
如果是大于两表相关联,最好选择交叉表为驱动表,交叉表是指被其它表所引用的表。
 
  
  
 
 
RBO模式下,小表为驱动表的执行时间为大表是驱动的执行时间的:
0.078/2.253 = 2.26%!
 
驱动表的选择
 
 
此时的优化器模式为CBO,二者的执行时间仅仅相差:
0.328-0.313=0.015毫秒,二者几乎接近,这是为什么呢?我们再看二者执行计划:
 
 
我们发现,此时二者的执行计划 一模一样!这又是为什么?
驱动表的选择
驱动表(Driving Table)是指被最先访问的表,通常是以全表扫描的方式访问的。
    如果优化器是CBO,则优化器会检查SQL语句中每个表的物理大小、索引状态,然后寻找开销最小的执行路径。如果优化器是RBO,且所有连接条件都有索引对应,则驱动表是FROM子句中最后一个表。
无论如何,我们建议始终将记录小的表(如字典表)作为驱动表,则能适应CBO和RBO!
 
WHERE子句如何写
Oralce优化器的原理是采用自下而上的顺序解析WHERE子句,因此表之间的连接必须写在其他WHERE条件之前, 可过滤掉最大数量记录的条件必须写在WHERE子句的末尾 。
 
  
 
上述SQL语句的例子虽然符合优化规范的比不符合优化规范的写法仅仅快了不到0.4秒,但重要的是这是在当前单机环境、且没有任何其它数据库事务、业务很简单、连接的表仅有两个表的情况下。如果在实际的大业务量环境下,则这种优化效应将成 倍数级增长!
因此,我们建议任何时候编写SQL语句时要 使用表的别名、 对表的连接永远 写在WHERE后面的第一个位置,并对过滤条件进行估算, 按照降序的大小将这些 条件从WHERE子句最后部分往前排列
 
习题
1.SQL优化的步骤包含那几步?可以使用那几种工具或方法发现糟糕的SQL?
2.SQL调节的三大目标是什么?请举例来说明如何均衡负载。
3.一般来说,SQL优化包括三个阶段,分别是语法分析、优化和执行阶段。请问,语法分析阶段的主要任务是什么?Oracle在优化阶段优化器主要执行的任务和考虑的因素又分别包含哪些?
4.在SELECT少用*,多用具体的列名其理论依据是什么?
5.Truncate包含几种用法?画图并解释Truncate如何改变高水位线。
6.举例说明什么情况下应该尽量多用COMMIT,什么情况下不能。
7.使用DECODE合并多个相类似操作,其与减少对数据库的查询次数有关系吗?
8.应该避免那种不合适的通配符的使用方法?
9.解释什么是驱动表,应该如何选择驱动表。
10.推荐的FROM子句和WHERE子句应该如何写,并解释其原理。
 
3
1
分享到:
评论
3 楼 beiyeren 2012-12-08  
实在是厉害,连接的文档下载了,很收益
2 楼 dicmo 2012-12-08  
文章排版有点乱
1 楼 yanmingeye 2012-12-08  
哥们,厉害啊!

相关推荐

    SQL高级用法优化方法

    SQL高级用法优化方法 非常实用 即可方便初级用户也是高级用户的手变数

    基于案例学习SQL优化

    高级的SQL优化往往源于对业务需求的深刻理解。通过深入了解业务逻辑,可以预见到潜在的性能瓶颈,从而提前进行优化。 课程可能涵盖以下内容: - SQL语句的分析和执行过程 - 索引原理及优化 - 查询计划的查看和...

    收获不止SQL优化

    第2章 风驰电掣——有效缩短SQL优化过程 24 2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优...

    收获,不止SQL优化--抓住SQL的本质1

    - **全书总结**:本书不仅是一本关于SQL优化的技术书籍,更是引导读者进入SQL优化世界的指南。通过丰富的案例、实战经验和深入的技术探讨,帮助读者建立起从宏观到微观的优化思路,并最终达到“爽”的境界。 - **...

    收获,不止SQL优化 PDF 带书签 第三部分

    随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题,...

    ORACLE SQL 优化 存储过程 PROCEDURE

    ORACLE SQL 优化存储过程 PROCEDURE 是一篇结合实际开发经验和理论知识的文章,旨在帮助开发者提高 SQL 开发效率和优化存储过程。文章涵盖了广泛的知识点,从基本的 SQL 语句到高级的优化技术。 基本 SQL 知识点 ...

    收获,不止SQL优化

    , 随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题...

    落落 Oracle SQL优化与改写培训教程

    大量优化实战方法:将主要SQL优化点一一剖析,分享大量SQL优化的实际工作经验 50余改写调优案例:覆盖大多数DBA日常工作场景,具有相当大的实用价值 技巧+案例:可以作为DBA的参考手册,也可以作为开发人员编写SQL...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    综上所述,这些资料涵盖了从基础到高级的SQL优化和数据库性能提升方法,对于数据库管理员、开发人员和面试者来说,都是非常宝贵的学习资源。理解和掌握这些知识点,不仅可以提高面试成功率,还能在实际工作中提升...

    大道相通,得鱼忘筌 - 从Oracle的SQL优化到MySQL的SQL优化.pdf

    在数据库管理与优化领域,SQL优化是至关重要的一环,它涉及到数据库性能的提升以及系统资源的有效利用。在不同数据库管理系统(DBMS)之间,如从Oracle迁移到MySQL,虽然两个系统有着各自的特性,但是优化的核心思想...

    sql高级优化

    ### SQL高级优化技巧详解 #### 一、选择最有效率的表名顺序 在基于规则的优化器中,Oracle解析器会从右至左处理FROM子句中的表名。为了提高查询效率,需要确保FROM子句中记录条数最少的表作为基础表,即驱动表。...

    sql优化小工具

    - 高级的SQL优化工具往往能与Git等版本控制系统无缝集成,使得SQL代码的版本管理和历史对比更为便捷。 7. **导出与分享** - 格式化后的SQL语句可以导出为文本文件,方便在团队成员之间共享和讨论。 - 有的工具...

    SQL优化实例讲解

    了解和掌握CBO的工作原理对于进行高级SQL调优至关重要。 ### 十、数据库与操作系统数据统计 文章还涵盖了如何在Oracle中统计数据库数据,以及如何统计操作系统层面的数据,这些知识对于全面监控和优化系统性能具有...

    mysql优化-sql高级

    mysql优化从以下几个方面介绍 mysql的架构 索引优化分析 查询截取分析 mysql锁机制 主从复制

    程序员级别的sql优化

    对于程序员而言,掌握高级SQL优化技巧不仅能够提高工作效率,还能在项目开发中解决各种复杂的性能问题。 #### SQL优化的核心技术与实践 ##### 1. 减少不必要的数据读取 在进行SQL查询时,应尽量减少从磁盘读取的...

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    在实际操作中,SQL优化与调优是一个不断迭代的过程,需要数据库管理员结合具体的业务场景和性能指标,综合运用上述知识点,通过测试和实践不断调整和优化。由于是关于Oracle高性能SQL引擎的深入剖析,这本资料是...

    数据库面试题索引sql优化

    SQL优化是一项重要的技能,它能够显著提升数据库系统的性能。以下是一些常见的SQL优化技巧: 1. **合理使用索引:** - 为经常出现在WHERE子句中的列创建索引。 - 对于频繁使用的JOIN操作中的关联列建立索引。 - ...

    informix入门和SQL优化

    通过持续的学习和实践,不仅可以掌握Informix数据库的基本操作,还能深入了解其高级特性,如SQL优化,从而在面对复杂业务需求时,能够设计出更加高效、可靠的数据库解决方案。此外,积极参与社区讨论和交流,也是...

    高级SQL优化教程(很不错的学习资料)

    ### 高级SQL优化教程知识点总结 #### 一、RBO与CBO概念解析 **RBO(基于规则的优化)** - **定义**: RBO是数据库查询优化器的一种模式,它依赖于预设的规则集来决定如何执行查询。 - **特点**: RBO根据一组静态...

    Oracle数据库SQL培训 数据库SQL语句编写培训教程 Oracle高级查询SQL优化 集合实际案例讲解 共26页.pptx

    总的来说,Oracle数据库SQL培训旨在帮助用户熟练掌握高级查询技术,理解并应用SQL优化策略,以便在实际工作中更高效地处理和分析数据。通过具体的案例讲解,学习者能够将理论知识转化为实际操作,提升数据库管理效率...

Global site tag (gtag.js) - Google Analytics