Oracle9i 优化器介绍 By Davis E-Mail:todav is@gmail.com Blog:dav is.blogchina.com 选择合适的优化器目标 默认情况下,CBO 以最佳吞吐量为目标,这意味着 Oracle 使用尽可能少的资源去处理 被语句访问到的所有行;当然 CBO 也可以用最快的响应速度来优化 SQL,这意味着 Oracle 用尽可能少的资源去处理被语句访问到的第一行或前面少数行,当然这种情况对于整个语句 来说可能消耗更多的资源。 优化器产生的执行计划会因―优化器目标‖的不同而不同。如果以最佳吞吐量为目标, 结果更倾向于使用全表扫描而不是索引扫描,或者使用排序合并连接而不是嵌套循环连接; 如果以最快的响应速度为目标,其结果则通常倾向于使用索引扫描和嵌套循环连接。 例如,假使你有一个语句既能运行于嵌套循环连接又能运行于排序合并连接,排序合并 连接能够较快的返回全部查询结果,而嵌套循环能快速的返回第一行或前面少数行结果。如 果你是以提高吞吐量为优化器目标,优化器就会倾向于选择排序合并连接;如果你的优化器 目标是提高响应速度,则优化器倾向于选择嵌套循环连接。 选择优化器目标要以你的应用为基础,一般规则是: 1、 对于批处理应用,以最佳吞吐量为优化目标为好。例如 Oracle 报表应用程序。 2、 对于交互式应用,以最快响应速度为优化目标为好。例如 SQLPLUS 的查询。 影响优化器优化目标的因素主要有: 1、 OPTIMIZER_MODE 初始化参数。 2、 数据字典中的 CBO 统计数据。 3、 用来改变 CBO 优化目标的 Hints。 OPTIMIZER_MODE 初始化参数 这个初始化参数用来规定实例的默认优化方法。其值列表及说明如下: Value CHOOSE ALL_ROWS Description 此为缺省值。优化器既可以使用基于成本的优化方法(CBO),也可以使用 基于规则的优化方法(RBO),其决定于是否有可用的统计信息。 1、 如果在被访问的表中,至少有一个表在数据字典中有可用的统计 信息存在,则优化器使用基于成本的方法。 2、 如果在被访问的表中,只有部分表在数据字典中有可用的统计信 息,优化器仍然会使用基于成本的方法,但是优化器必须为无统 计信息的表利用一些内部信息去尝试其他的统计,比如分配给这 些表的数据块的数量等,这可能会导致产生不理想的执行计划。 3、 如果在被访问的表中,没有一个表在数据字典中有统计信息,则 优化器使用基于规则的方法。 不论是否有统计信息存在,优化器都使用基于成本的...