摘 要 在数据库应用中,根据用户提交的查询请求,如何才能精炼又高效地得到查询结果?从多个角度描述怎样优化SQL语句。实验结果表明,SQL优化能够减轻系统资源的占用,满足用户的要求。

关键词 SQL优化;RBO;CBO;SGA;高效SQL

中图分类号:TP311 文献标识码:B 文章编号:1671-489X(2012)03-0074-03

Research on Oracle SQL Performance Optimization//Wang Guanxiang1, Zhang Huanyuan1, Xia Yadong1, Liu Jin1, Wang Huabing2

Abstract In the database application, how to refining and efficiently get the query result according to user’s query request? This article describes how to optimize the SQL statement with many aspects. The experimental results show that, SQL optimization that can reduce the occupier of system resources, to meet the requirements of the customers.

Key words SQL optimization; RBO; CBO; SGA; efficient SQL

Author’s address

1 Department of Network and Education Technology, SDAU, Taian, Shandong, China 271018

2 Nanjing R&D Center, ZTEsoft, Nanjing, China 210012

在计算机应用中离不开数据库应用,数据库应用首当其冲就是SQL优化,最常用的企业数据库是Oracle;精炼又高效率的SQL语句对一个大型网站或大型数据库来讲是很有用的,SQL的冗余造成系统与资源的占用和时间的增加。什么样的SQL才算是高效的SQL呢?如何用最少的资源、最少的时间完成同样的事情呢?本文首先介绍Oracle的体系架构,然后分析SQL的执行流程,接着从Oracle优化器如何查看执行计划,如何使用索引,最后结合实例,从各个角度来描述怎样优化SQL。

1 Oracle的SGA和性能的关系

1.1 Oracle的SGA介绍

Oracle的SGA(数据库的系统全局区)主要由3部分构成:共享池、数据缓冲区、日志缓冲区。

1)共享池。共享池又由两部分构成:共享SQL区和数据字典缓冲区(data dict cache)。共享SQL区专门存放用户SQL命令,Oracle使用最近最少使用等优先级算法来更新覆盖;数据字典缓冲区(library cache)存放数据库运行的动态信息。数据库运行一段时间后,DBA需要查看这些内存区域的命中率,以从数据库角度对数据库性能调优。通过执行下述语句查看。

①“select (sum(pins - reloads)) / sum(pins) “Lib Cache”  from  v$librarycache;”,查看共享SQL区的重用率,最好在90%以上,否则需要增加共享池的大小。

②“select (sum(gets - getmisses - usage - fixED)) / sum(gets) “Row Cache”  from v$rowcache;”,查看数据字典缓冲区的命中率,最好在90%以上,否则需要增加共享池的大小。

2)数据缓冲区。数据缓冲区存放SQL运行结果抓取到的data block;“SELECT name, value   FROM v$sysstat   WHERE name IN (‘db block gets’, ‘consistent gets’,’physical reads’);”,查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。命中率应该在90%以上,否则需要增加数据缓冲区的大小。

3)日志缓冲区存放数据库运行生成的日志。“select name,value from v$sysstat where name in (‘redo entries’,’redo log space requests’);”,查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率:申请失败率=requests/entries。申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加Oracle数据库的日志缓冲区。

1.2 结论:提高share pool中SQL共享率

share pool中SQL共享率对性能影响很大,如何提高呢?

1)SQL文本完全相同:upercase and lowercase,white space (spaces, tabs, carriage returns),comments。

2)参考对象相同(Referenced schema’s objects must be the same objects)。

3)绑定变量相同(Bind variables must match the same name and data type)。

所以对于格式相同、具体条件不同的SQL,建议经常使用变量来代替常量,以尽量使用重复SQL代码,避开parse阶段,提高执行速度。尽量使用存储过程;尽量使用变量代替常量,可以提高share pool共享率,跳过parse阶段,提高效率。

2 SQL执行步骤

了解SQL的执行步骤有利于更好地优化它们,每条SQL语句执行时主要经历以下几步。

1)解析(parse):查找是否有相同的语句;检查语法、对象名称以及权限;锁住对象;生成执行计划。

2)执行(execution):定位所选取的记录。

3)取回(Fetch):将记录返回给用户进程。

其中,Parse是最有优化潜力的阶段。Cursor创建后,Oracle将在share pool中寻找是否该SQL语句已经存在,若已经存在且已经被parsed,则不需要再执行parse,所以能利用share pool中现成的parse结果很重要,提高SQL共享率。

3 Oracle优化器

Oracle优化器有两大类,基于规则的和基于代价的;在SQLplus中可以查看数据参数optimizer_mode来确认数据库缺省的优化器模式。

3.1 基于规则的优化器(RBO)

基于规则的查询,数据库根据表和索引等信息,按照一定的规则来产生执行计划。

3.2 基于代价优化器(CBO)

基于代价的查询,数据库根据搜集的表和索引的数据的统计信息综合来决定选取一个数据库认为最优的执行计划。

3.3 优化器的模式

优化器的模式有Rule、CHOOSE、FIRST_ROWS、ALL_ROWS等。Oracle的很多查询方面的特性必须在基于代价的模式下才能体现出来,所以通常不选择RULE,在高版本的Oracle中,默认的优化器模式都是基于代价的。

4 执行计划

所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。SQL优化的主要目的是降低逻辑读,可以通过多种方式查看SQL执行计划(如命令行、通过第3方工具查看,比如PL/SQL DEV、toda等)。

5 Oracle访问数据的存取方法

5.1 Oracle存取数据的方式对SQl的性能影响很大

先了解一下Oracle的存取方式。

1)全表扫描(Full Table Scans,FTS):读取表高水位线下所有数据块,并检查每一行数据是否满足语句的WHERE限制条件。

2)通过ROWID的表存取(Table Access by ROWID):行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。

3)索引扫描(Index Scan或index lookup):先通过index查找到数据对应的ROWID值,然后根据ROWID直接从表中得到具体的数据。这种查找方式被称为索引扫描或索引查找(index lookup)。

5.2 如何创建索引,提高数据库执行效率

1)索引创建原则。在select操作占大部分的表上创建索引;在where子句中出现最频繁的列上创建索引;在选择性高的列上创建索引;复合索引的主列应该是最有选择性的和where限定条件最常用的列;小于5 M的表,最好不要使用索引来查询,表越小,越适合用全表扫描。

2)索引使用原则。查询结果是所有数据行的5%以下时,使用index查询效果最好;where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引;因为当SQL语句所查询的列全部都出现在复合索引中时,此时由于Oracle只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;索引利于select,但对经常insert、delete尤其update的表,会降低效率。

6 SQL语句编写要领

6.1 SQL语句需要避免不走索引

Oracle在下列几种情况不走索引:建立组合索引,在包含有null值的table列上建立索引,当使用select count(*) from table时不会使用索引;在索引列上使用函数时不会使用索引,如果一定要使用索引,只能建立函数索引;当被索引的列进行隐式的类型转换时不会使用索引;使用<>like’%dd’,百分号在前;not in, not exist。

6.2 必要时可以使用Hints机制稳定执行计划

Oracle Hints是一种机制,用来告诉优化器按照告诉它的方式生成执行计划,进而达到稳定执行计划的目的。可以用Oracle Hints来实现:使用的优化器的类型;基于代价的优化器的优化目标是all_rows还first_rows;表之间的连接类型;表之间的连接顺序;语句的并行程度。

6.3 SQL连接方式

Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。典型的连接类型共有3种:排序合并连接(Sort Merge Join,SMJ)、嵌套循环(Nested Loops,NL)、哈希连接(Hash Join)。

7 SQL编写原则

7.1 原则1

建议使用CBO(基于开销的优化器cost-based-optimizer);对于任何SQL语句一定要考虑其性能;通过查看执行计划来比较SQL语句的优劣,防止经验主义;可以利用hint等功能,只在非常必要时才使用hint:仅在对SQL的执行计划非常肯定地要使用hint时才使用。

7.2 原则2

Where条件中等号左边不要引用函数;where条件中对于不同的数据类型要做显示数据转换;NOT,!=,<>,||不会用索引;not exists好于not in;Exists好于in;用UNION代替DECODE;用UNION ALL代替UNION;用UNION代替OR;RDER BY不要加表达式。

7.3 原则3

避免复杂的SQL语句,采用多条语句代替;避免不必要的排序,使用Distinct、Group by、Order by等;使用表的别名;连接多个表时, 把表的别名前缀于每个column上,这样可减少解析的时间以及避免由column歧义引起的语法错误。

7.4 原则4

使用复合索引的第一个列;及时commit释放资源,回滚段上用于恢复数据的信息;commit不要太频繁;分批处理、逐次提交。

7.5 原则5

分页;运算放在常量端;全表删除用truncate而不用delete;删除大量数据的方法;更新大量数据时使用临时表。

7.6 原则6

绑定变量ID=1 / ID=:V;硬分析/软分析:语法检测、语义检查、检查共享池中是否有相同的语句存在,如果存在,则重用共享池中的SQL的执行计划和优化策略(软解析);如果不存在,则重新生成SQL的执行计划和优化策略(硬解析)。

8 结束语

SQL语句是否高效,Oracle是否真正使用索引,使用索引是否真正有效,还是必须进行实地的测验。合理的做法是,对所写的复杂的SQL,在将它写入应用程序之前,先在数据库上做一次explain trance,获得对该SQL的解析,明确看到Oracle是如何执行该SQL的,并进行适当优化调整。另外,即使是相同的SQL语句,也会因为表的大小等原因造成执行计划的不同,所以一定要具体情况具体分析。如果经常做explain就会发现,喜爱写复杂的SQL并不是个好习惯,因为过分复杂的SQL其解析计划往往不尽如人意。事实上,将复杂的SQL拆开,有时候会极大地提高效率,因为能获得很好的优化。

参考文献

[1]钟小权,叶猛.Oracle数据库的SQL语句优化[J].计算机与现代化,2011(3):124-126.

[2]李爱武.基于Linux的Oracle数据库管理[M].北京:北京邮电大学出版社,2008.

[3]赵振平.Oracle数据库精讲与疑难解析[M].北京:电子工业出版社,2008.

[4]刘光霆.ORACLE中SQL查询优化研究[J].计算机与信息技术,2008,32(5).

[5]刘博.Oracle数据库性能优化与调整[D].大连:大连理工大学,2007.

[6]仇道霞,陆伟,侯晓辉.Oracle数据库性能调整优化[J].山东轻工业学院学报:自然科学版,2010,24(3):52-54.

oracle性能优化求生...,Oracle,SQL性能优化之探究|《oracle性能优化求生指南》相关推荐

  1. SQL优化工具分享-SQL Tuning Expert Pro for Oracle Trial

    做开发离不开对于数据库的接触,也离不开对SQL的接触,一个优质的SQL,可以让系统性能提升到质的飞跃,一个糟糕的SQL,可以让系统奔溃.所以对于我们开发人员来说,很需要一个SQL性能优化工具,在这种情 ...

  2. mysql报表统计 优化_关于SQL调优与报表的性能优化

    前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...

  3. sql server oracle转换,sql-server – 如何从SQL Server DBA转换到Oracle?

    Oracle和SQL Server有许多架构和惯用的差异,文档中使用了几个不同的术语.我这样做已经有好几年了,但是一些主要的惯用差异是: > Oracle没有直接等同于tempdb.全局临时表是 ...

  4. 【转】sql语句优化工具LECCO SQL Expert

    软件说明: 更优更快 人工智能自动SQL优化----------http://www.sina.com.cn 2001/12/12 17:48 中国电脑教育报文/SQL爱好者 所谓SQL,就是指Str ...

  5. oracle sq语句查询时间,Oracle实现查询时间段的Sql语句两法

    Oracle实现查询时间段的Sql语句两法,相比ORacle要查询时间段的Sql语句还是与Sql Server的Sql语句有区别的,下面举两种方法来说明在ORacle是如何查询时间段的: 第一种方法: ...

  6. Oracle数据库使用Analyze提升sql性能

    Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...

  7. oracle sql 查询优化器,基于ORACLE成本优化器的SQL查询优化分析与应用

    第 39 卷 第 2 期2018 年 3 月 内蒙古农业大学学报( 自 然 科 学 版 ) Journal of Inner Mongolia Agricultural University ( Na ...

  8. 10年+SQL性能优化专家谈SQL等价改写核心思想

    墨墨导读:2020数据技术嘉年华于11月21日落下帷幕,大会历时两天,来自全国各地的数据领域学术精英.领袖人物.技术专家.从业者和技术爱好者相聚北京,见证了个人的快速成长.技术的迭代进步.行业的蓬勃发 ...

  9. MySQL数据库性能优化由浅入深(表设计、慢查询、SQL索引优化、Explain分析、Show Profile分析、配置优化)

    文章目录 0 SQL性能分析 1 表的设计合理化 1.1 为什么需要范式 1.2 三范式原理 1.3 什么样的表才满足三范式 2 慢查询 2.1 慢查询介绍 2.2 慢查询步骤 3 添加适当索引 3. ...

  10. oracle层级计算推演,(特价书)Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解(资深Oracle专家黄玮十年磨一剑,盖国强作序力荐)(china-pub首发)...

    第一篇 执 行 计 划 执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让 ...

最新文章

  1. 指针07 - 零基础入门学习C语言47
  2. Grid不可编辑时,设置行背景颜色
  3. muduo之Thread
  4. Java EE之旅02 CSS基础
  5. IDEA安装和运行HelloWorld
  6. 把txt文件中的json字符串写到plist文件中
  7. Jmeter参数化的理解
  8. 安卓第一阶段实训项目:基于存储卡音乐播放器(更新中……)
  9. python 栈和队列_python实现栈和队列
  10. 游泳,情人节纪念一下。
  11. WhereHows 数据发现和管理工具
  12. iText PDF设置字体样式
  13. 高一数学微课堂【教学视频】
  14. 列表表达式爬取红牛分公司数据
  15. vue 符号..._如何在Windows 8.1上输入和使用表情符号
  16. gs--常见函数说明
  17. [SSL: CERTIFICATE_VERIFY_FAILED]
  18. web前端开发和岗位职责
  19. 丁小平微积分研究成果刍议(转载)
  20. 运用JAVA基础阶段知识,模拟双色球机选抽奖过程

热门文章

  1. c语言酶切算法,科学网—FitHiC V1算法解析(一) - 卢锐的博文
  2. 数据速率bit/s计算的简易法则
  3. Microsoft Exchange Server中的四个零日漏洞已被链接使用在野袭击
  4. three.js走进WebVR世界(二)之VREffect.js与VRControls.js
  5. Ceph配置——6.心跳设置
  6. matplotlib.pyplot / plt trick
  7. 如何用一个简单的内容升级心理学技巧将转化率提高了845%
  8. Spring视频转码工具类ffmpeg
  9. android 华为推送sd卡,华为推送通道集成指南
  10. ionic之样式复选框