摘要 本文提出了一种优化Oracle数据库的方法。Oracle中SQL语句的执行过程可分为解析(Parse)、执行(Execute)和提取结果(Fetch)三步,此方法就是通过对SQL语句在Oracle数据库中优化执行的三个过程来提高Oracle数据库的性能。

关键词 数据库 扫描 多表联结 子查询

1 如何优化Parse

1. 1 SQL语句的Parse处理步骤:

1) 计算语句值

2) 共享池中有无与此语句值相同的语句?

3) 共享池中有与此语句字符完全匹配的语句?

4) 准备要运行的SQL语句

5) 为新语句在共享池中创建空间

6) 将语句存放在共享池中

7) 修改共享池图,标明语句的值和在共享池中的位置

8) 执行准备好的SQL语句

最理想的是,语句只执行1、2、3和8步来进行处理。不经过2、3步来测试被传给Oracle的语句要使用1~8步进行处理。只经过1、2、3、8的SQL语句要比经过1~8步的语句更为有效。

1.2 在共享池中重用SQL语句

当SQL语句被传递给Oracle处理时,其秘诀是重复使用已经在共享池中的语句,而不是让Oracle在接受语句时去准备新的语句。前面表明,如果Oracle接受了一个与共享池中的语句相一致的语句,就重用共享池中的语句。

Oracle提供在数据库中存储代码的能力。当应用系统开始运行时,从数据库中读取代码(可用PL/SQL语句编制)并像其它语句那样传递到共享池中去处理。从数据库中取出的代码是编译过的并驻留在共享池中。

可以利用数据库中存储的程序代码设计应用系统,检查所有的事务处理以及主要的通用的过程,研究现有的应用系统并把主要的处理程序转换为数据库中存储的程序代码。在Oracle中存储代码可以通过过程、程序包、函数、触发器等来实现。

2 如何优化Execute和Fetch

2.1 避免无计划的全表扫描

全表扫描连续从表读取所有数据,而不管数据是否与查询有关。避免不必要的全表扫描有两个充足理由:1)全表扫描没有选择性

2) 过全表扫描读取的数据很快从SGA的缓冲区移走(如果正在扫描的表不是“高速存储”的表)

在基于规则优化的情况下,如果下列任何条件在SGA语句出现,就要对一个表进行全表扫描。

1) 该表无索引

2) 对返回的行无任何限定条件(如无Where语句)

3) 对数据表与任何索引主列相对应的行无限定条件。例如,在City-State-Zip列上创建了三列复合索引,那么仅对State列有限定条件的查询不能使用这个索引,因为State不是索引的主列。

4) 对索引主列的行有限定条件,但条件或者是NULL或者是不相等。例如,City列上存在索引,在所有下列情况下都不会使用索引。

Where city is null

Where city is not null

Where city!=’liaoning’

5) 对索引主列的行有限定条件,但条件在表达式里使用。例如,如果在City列上索引,那么限定条件

Where City=’liaoning’

可以使用索引。然而,如果限定条件是

Where UPPER(City)=’liaoning’

那么不会使用City列上的索引,因为City列在UPPER函数里。如果将City列与文本字符串联结在一起,也不会使用索引。例如,如果限定条件是

Where City||’x’ like ‘liaoning%’

那么不会使用City列上的索引。

6) 对索引主列的行有限定条件,但条件使用Like操作以及值以‘%’开始或者值是一个赋值变量。例如,在所有下列情况下都不会使用索引:

Where City like ‘%aonin%’

Where City like :City_Bind_Variable

如果表小、索引列无选择性,基于开销的优化器可能决定使用全表扫描。

2.2只使用选择性索引

索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是1.0。依据非空值列的唯一索引,通常其选择性为1.0。

如果使用基于开销的最优化,优化器不应该使用选择性不好的索引。

索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是1.0。依据非空值列的唯一索引,通常其选择性为1.0。

索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有1000个记录,表索引列有950个不同值,那么这个索引的选择性就是950/1000或者0.95。最好的可能性选择是1.0。依据非空值列的唯一索引,通常其选择性为1.0。

2.3管理多表联结

Oracle提供了3个联结操作:NESTED LOOPS、HASH JOIN和MERGE JOIN。MERGE JOIN是一组操作,在所有行被处理完之前,它不返任何记录给下一操作。NESTED LOOPS和HASH是行操作,因此会很快将第一批记录返回给下一个操作。

在每个联结选项里,必须执行一些步骤以获取最好的联结性能。如果没有适当地优化联结操作,那么联结所需的时间也许随着表的增长而呈指数级地增长。

2.4管理包含视图的SQL语句

如果查询包含视图,优化器有两种执行查询的方法:首先解决视图然后执行查询,或者把视图文本集成到查询里去。如果首先执行视图,那么首先完成全部的结果集,然后用其余的查询条件做过滤器。

首先解决视图会导致查询性能下降的问题,这取决于所涉及表的相对大小。如果视图被集成到查询里,那么查询的条件也可以应用于视图里,并且可以使用一个小一些的结果集。然而在一些情况下,也许可以通过视图分离组操作提高查询性能。

如果一个视图包含集合的操作(如Group by、SUM、COUNT或者DISTINCT),那么视图不能被集成到查询里去。

不使用组或者没有集合操作的视图的SQL语法可以被集成到大的查询里去。

2.5优化子查询

当使用自查询时,也许会碰到几个独特的问题。涉及子查询的查询潜在问题如下:

 也许在执行完查询的剩余部分前执行子查询(与执行分组功能的视图相似)。

 子查询也许要求特定的提示,但这些提示不直接与调用该子查询的查询有关

 可以作为单个查询执行的子查询也许被代替写成几个不同的子查询。

 也许在使用not in子句或者not exists子句时,不能在最有效的方式下进行子查询的存在查询。

1)当执行子查询时

如果一个查询包含子查询,那么优化器有两种完成查询的方法:首先完成子查询,然后完成查询(“视图的方法”),或者将子查询集成到查询里去(“联结”的方法)。如果首先解决子查询,那么整个子查询的结果集将首先被计算,并且用查询条件的剩余部分做过滤器。如果没有使用子查询去进行存在检查,那么“联结”方法将通常要比“视图”方法完成得好。

如果一个子查询包括集合操作,如group by,SUM或者DISTINCT,那么不能集成子查询到查询的其余部分里去。非集成的子查询限制了提供给优化器的选项。

2)如何组合子查询

一个查询可以包含多个子查询,使用的子查询越多,集成或者重写它们到大的联结里就越困难。既然有多个子查询使集成困难,就应该尽可能地组合多个子查询。

3)怎样进行存在检查

有时子查询不返回行(记录),但可以进行数据正确性检查。在相关表里的记录或者存在或者不存在的逻辑检查,称为存在检查。可以使用exists和not exists子句提高存在检查的性能。

2.6管理对非常巨大的表的访问

随着表增长到比SGA的数据块高速缓冲区存储器的空间显著大时,需要从另一个角度优化对这个表的查询。

1)问题

当表和它的索引小的时候,在SGA里可以有高度的数据共享。多用户读表或索引范围扫描可以反复使用同一个块。随着表的增长,表的索引也在增长。随着表和它的索引增长到比SGA里提供的空间大时,范围扫描需要的下一行将在SGA里找到的可能性变小,数据库的命中率将减小。最后,每一个逻辑读将要求一个单独的物理读。对使用非常大的表的优化方法着眼于特别的索引技术和有关索引的选择。

2)管理数据接近

在访问非常大的表期间,如果倾向于继续使用索引,那么应该关注数据接近,即逻辑相关记录的物理关系。为了使数据最大限度地接近,应该连续往表里插入记录。记录按通常在表的范围扫描里使用的列排序。

3)避免没有帮助的索引扫描

如果要对大表使用索引扫描,那么不能假定索引扫描将比全表扫描执行得更好。不紧跟表访问的索引唯一扫描或范围扫描执行得比较好,但紧跟通过RowID的表访问的索引范围扫描也许执行得差。随着表增长到比数据块高速缓冲存储器大得多,最终,索引扫描和全表扫描间的平衡点打破。

4)创建充分索引的表

如果表中的数据相当稳定,充分索引一个表是很有用的。创建一个复合索引,它包括所有在查询期间通常选择的列。在查询期间,查询要求的所有数据可以通过索引访问提供,不需要任何表访问。

5)并行选项

可以把一个数据库任务,比如Select语句,分为多个单元的工作,由多个Oracle进程同时执行。这种能够允许数据库的单个查询活动由多个协调的进程透明地进行处理的能力,称为并行查询选项(PQO)。

并行选项调用多个进程来利用空闲的系统资源,以减少完成任务所需要的时间。并行选项并不减少处理过程所要求的资源数量,而是把处理的任务分散给多个CPU。为了从并行选项中得到最大的好处,应该使CPU和磁盘上的I/O不要满负荷使用。因为并行的目的是使更多的CPU和磁盘同时参与处理数据库的命令,一个缺乏CPU和I/O资源的服务程序是不能从并行选项中得到好处的。

2.7使用UNION ALL而不是UNION

最常用的集操作是UNION操作,UNION操作使多个记录集联结成为单个集。UNION操作的数学定义是返回记录的单个集并且没有重复的行,所以在合并结果集里,Orac

数据分片排序oracle,Oracle数据库的优化相关推荐

  1. 数据分片排序oracle,基于ORACLE数据库的海量数据脱敏方法与流程

    本发明涉及一种数据脱敏方法,尤其涉及一种基于oracle数据库的海量数据脱敏方法. 背景技术: oracle数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管 ...

  2. oracle停数据库服务器,优化Oracle停机时间及数据库恢复

    优化Oracle停机时间及数据库恢复 作者:网络 佚名 2006-02-22 00:00 评论 分享 [IT168 服务器学院]这里会讨论令Oracle停机时间最小化的步骤.各种形式的停机--计划的或 ...

  3. oracle 8i 数据库修复,优化调整Oracle 8i数据库

    导读: Oracle 8i数据库服务器是高度可优化的软件产品,经常性的调整可以优化系统的性能,防止出现数据瓶颈.我们通过调整数据库系统,可以使它达到最佳性能以满足用户的需要.下面,笔者将介绍优化和调整 ...

  4. mysql数据和性能平衡点_MySQL数据库性能优化(2)

    4.影响SQL性能的要素 MySQL数据库的性能不止受到性能参数和底层硬件条件的影响,在这两个条件一定的情况下,开发人员对SQL语句的优化能力更能影响MySQL数据库的性能.由于MySQL中不同数据库 ...

  5. beego mysql按时间排序_beego的数据库操作优化

    1.背景描述 用beego的ORM框架对sqllite进行库操作.项目中配置表存放在sqlite数据中,这样就存对每个表需要进行增删改查的操作.若按照beego提供方式对每一张表去实现增删改查的操作, ...

  6. oracle数据库删除百万级数据库,数据库SQL优化大总结之 百万级数据库优化方案...

    (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最 ...

  7. oracle使用 union all 用自增序列_值得收藏的Oracle数据库性能优化

    值得收藏的Oracle数据库性能优化 年尾了,新的一波面试军又要开始了,被问到最多的可能就是性能优化,尤其是数据库性能优化,这个面试题不管是初中高级工程师都会被问到.因此我觉得下面31点ORACLE优 ...

  8. oracle union all 特别慢_值得收藏的Oracle数据库性能优化

    前言 年尾了,新的一波面试军又要开始了,被问到最多的可能就是性能优化,尤其是数据库性能优化,这个面试题不管是初中高级工程师都会被问到.因此我觉得下面31点ORACLE优化还是值得调几个去面试.也方便以 ...

  9. oracle查询优化不走缓存,Oracle数据库存储优化问题

    cache如何优化存储系统读写性能 上的Cache又称硬盘缓存,是成在硬盘控上的一块内存芯片,和上的内存一样,它具快的存取速度.简单地说,硬盘缓存起着硬盘内部储存和外部读取之间的缓冲的功能.当硬盘接收 ...

最新文章

  1. 二叉树的层次遍历 II[LeetCode-107]
  2. ZeroMQ接口函数之 :zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据...
  3. [C++][线程安全]单例模式下双检查锁和线程
  4. asp.net JavaScriptSerializer实现序列化和反序列化
  5. 帝国理工:如何用 AI 解决 80% 专科医生担忧的心律装置移植手术难题
  6. linux下与windows下的换行符
  7. 安全企业 Stormshield 披露数据泄露事件 源代码被盗
  8. C++中使用模板,new创建2维动态数组
  9. layui 时间控件(laydate) 闪退问题
  10. 电力-104规约实际测试1
  11. python scapy发包_网络协议编辑器――简单的发包工具实现(python+scapy+pycharm)
  12. 解决Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
  13. Network Password Recovery工具查看windows凭据密码
  14. 使用 rimraf 快速删除 node_modules
  15. html5 input搜索框样式修改,修改input搜索框默认叉号的样式为自定义图片
  16. 【CV系列】照度和最低照度相关概念
  17. 易语言误报优化助手 v1.5
  18. 浙江python改革_重大改革:Python 语言将被加入高考科目!
  19. python正则表达式匹配专利号
  20. 快捷键和搜索引擎的使用

热门文章

  1. UNITY polygon collider不随物体旋转
  2. 万字长文浅析SpringCould微服务负载均衡框架Ribbon源码(字多慎入)
  3. 学习笔记之与 30 家公司过招,得到了这章面试心法
  4. 同时开左右两个SAPGUI编辑器显示同一段ABAP代码
  5. 关于移动端meta设置(未完待续)
  6. html5-常用的通用元素
  7. IIS短文件/文件夹泄露漏洞
  8. 定时器表达式各组成部分详解
  9. TFS自定义开发中的反射应用
  10. KnowledgeTree简体中文汉化包安装指导