Heim >Datenbank >MySQL-Tutorial >Oracle 优化器与sql查询执行顺序

Oracle 优化器与sql查询执行顺序

WBOY
WBOYOriginal
2016-06-07 17:13:401205Durchsuche

Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在

Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在不同的条件下,一个SQL可能存在多条执行计划,但是在某个特定的时间点,,特定的环境下,一定只有一种执行计划是最优的。

一、优化器的类型:

oracle 的优化方式有两种,一种是基于规则的RBO(Rule-Based Optimization),一种是基于开销或者代价的CBO(Cost-Based Optimization)。

1. RBO: oracle在执行查询时遵循oracle内部预定义的一些规则。

2. CBO:基于开销或者代价的执行计划,这里的开销是主要是指CPU和内存的使用。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在Oracle8及以后的版本,Oracle列推荐用CBO的方式。

我们要明了,不一定走索引就是优的 ,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时对这个表做全表扫描(full table scan)是最好的。

二、优化器的优化模式(Optermizer Mode)

优化模式包括Rule,Choose,First rows,All rows这四种方式,也就是我们以上所提及的。如下我解释一下:

Rule:不用多说,即走基于规则的方式。

Choolse:这是我们应观注的,默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。

备注:查看执行计划,在plsql中按F5。如:

SELECT STATEMENT, GOAL = ALL_ROWS   7 4 72

MERGE JOIN CARTESIAN   7 4 72

TABLE ACCESS FULL CSMS Z_STUDENT 3 2 18

BUFFER SORT   4 2 18

TABLE ACCESS FULL CSMS Z_CLASS 2 2 18

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn