11GConcepts(翻译第七章)SQL(结构化查询语言)(四)

2014-11-24 10:18:21 · 作者: · 浏览: 18
查询计划(query plan).

你可以通过设置优化器目标和收集统计信息来影响优化器的选择。举个例子,你可能会在下面情况设置优化器目标:

·总的吞吐效率

ALL_ROWS hint 指示优化器获取 返回结果集中的最后一行,越快越好。

·初始响应时间
FIRST_ROWS hint 指示优化器获取 返回结果集中的第一行,越快越好。

一个标准的终端用户,交互应用 将在初始响应时间优化中获益。而 批处理模式,非交互式应用将在 总吞吐效率优化中收益。

Optimizer Components(优化器组件)

优化器包含三个主要组件,如下图显示

\

输入到优化器的已经是解析之后的查询了,优化器执行下列操作:

1、 优化器接受 解析后的查询,以及基于可用的访问路径和hints 为SQL语句产生一组可能的计划。

2、 优化器基于数据字典中的统计信息,为每个计划评估一个cost(成本)。成本是一个计划预期使用资源的 一个评估值

3、 优化器比较计划的成本,然后选择成本最低的那个,称之为query plan(查询计划),然后传递给 row source generator(行源生成器)

QueryTransformer(查询转换器)

查询转换器来决定改变查询的形状是否对查询有帮助(优化器是否能产生更好的执行计划)。传递到查询转换器的是解析之后的查询,解析后的查询表现为一堆query blocks。

Estimator(估算器)

估算器 来确定每个产生的执行计划的总计cost。估算器为了完成这个目标,生成了三个不同类型的测量值:

·Selectivity(选择性)

这个度量值表现为 一个行集中的一部分行。Selectivity(选择性)和查询谓词是紧密相连的。比如last_name=’Smith’, 或 一堆谓词的组合。

·Cardinality(基数)

这个度量值表现为 一个行集中的行数

·Cost(代价)

这个度量值表现为 工作量或者资源的使用 。查询优化器使用磁盘I/O,CPU使用率,内存使用率 作为 工作量

PlanGenerator(计划生成器)

计划生成器会为提交的查询,产生出一堆不同的计划,然后挑出其中成本最低的。优化器会为嵌套的子查询和 unmerged视图 产生子计划,它表现为不同的query block。计划生成器通过尝试不同的访问路径,join方法,join顺序。而探索出不同的执行计划。

优化器自动管理这些计划 并保证只使用经过验证的计划。SQL Plan Management(SPM)一个新计划,只有它被验证比当前计划更好时,才使用它。通过这样来控制计划的进化。

如EXPLAIN PLAN语句等诊断工具使你可以看到优化器选择的执行计划。EXPLAIN PLAN会显示指定的SQL查询,就好像它已经在当前会话中执行过一样。其他诊断工具还有OEM,以及SQLPLUS的AUTOTRACE命令,当AUTOTRACE 为ON时,执行语句 会在后面跟着显示它的执行计划

AccessPaths(访问路径)

访问路径是数据 从数据库中检索回来的路径。举个例子,一个查询使用索引和不使用索引就是两个不同的访问路径。普遍来说,索引访问路径在检索 表的行中 小的部分是,很快。全表扫描则在访问表中的很大一部分时,要快。

数据库可以使用不同的访问路径从一个表中检索数据。代表名单如下:

·Full table scans(全表扫描)

这种类型的扫描,将把一个表中的所有行都读出来,然后将不符合选择标准的过滤掉。数据库将顺序扫描segment中的高水位下所有数据块

·Rowid scans(rowid 扫描)

Rowed指定了每一行所在的数据文件,块,以及在块中的位置。数据库首先WHERE子句或者通过索引扫描,先获得行的rowid,然后再基于每个rowid找到每个被选择的行。

·Index scans(索引扫描)

这种扫描,在索引中扫描被索引列的值。如果这条语句只访问 索引中的列,那么Oracle数据库会在索引中直接读取 列值。

·Cluster scans

一个cluster scan是在检索 一个存储在 indexed table cluster上的表时使用的,相同cluster key只的所有行,都存在相同的数据块。数据库首先通过扫描 cluster 索引获取被选择行的rowid。Oracle数据库基于这些Rowid找到对应的行。

·hash scans

当扫描的行在 hash cluster中时,则会使用hash scan,这里所有hash后的值相同的行都存在相同的数据块中。数据库对cluster key 值应用hash 函数,获得hash值,然后扫描包含这个hash value的数据块获取相应的行

优化器选择访问路径 是基于对这个语句可用的访问路径,以及根据每个路径(或组合路径)估算的成本。

OptimizerStatistics(优化器统计信息)

优化器的statistics(统计信息)是一些收集好的数据,这些数据描述了数据库和数据库中对象的细节。统计信息提供了数据存储和分布。在优化器估算访问路径的时候会使用。

优化器统计信息包括如下:

·表统计信息

它们包括 行的数量,块的数量,平均行长度

·列统计信息

它们包括distinct 值(唯一值)的数量以及列中有多少null,以及数据的分布情况

·索引统计信息

它们包括叶块的数量,以及索引的高度

·系统统计信息

它们包括CPU和I/O的性能和利用率。

Oracle数据库会通过一个自动维护任务去 自动收集所有数据库对象上的统计信息以及维护它们。你可以通过DBMS_STATS包手动收集统计信息,这个PL/SQL包可以修改,查看,导出,导入以及删除统计信息。

优化器统计信息是为 优化查询而创建的,存在数据字典中。这些统计信息不要和通过动态性能试图看到的performance statistics(优化统计信息)搞混。

OptimizerHints(优化器hints)

Hint是一个SQL语句中的注释(comment),它的作用,类似对于优化器的指令。一些情况下,应用设计人员 ,他比起优化器来说,对应用数据更加清楚,他能选择选择一个更高效的路线来运行一个SQL语句。应用设计人员可以使用在SQL语句中使用hints来指定语句应该怎样运行。

举个例子,假设你的交互式应用 运行一个查询,返回了50行,这个应用程序初始仅仅获取查询的前25行,然后显示给终端用户,你希望优化器产生一个执行计划,这执行计划尽可能快的获取前25行,这样用户就不需要被迫等待了。你可以使用一个hint来发送这个指令给优化器,想下面语句显示的(这里之前使用了AUTOTRACE ON)

SELECT /*+ FIRST_ROWS(25) */ employee_id,department_id

FROM hr.employees

WHERE department_id > 50;

------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes

------------------------------------------------------------------------

| 0 |SELECT STATE