快捷搜索:

如何用智能优化器提高Oracle的性能(1) - 智能优

耗损在筹备新的SQL语句的光阴是Oracle SQL语句履行光阴的最紧张的组成部分。然则经由过程理解Oracle内部孕育发生履行计划的机制,你能够节制Oracle花费在评估连接顺序的光阴数量,并且能在大年夜体上前进查询机能。

筹备履行SQL语句

当SQL语句进入Oracle的库缓存后,在该语句筹备履行之前,将履行下列步骤:

1) 语法反省:反省SQL语句拼写是否精确和词序。

2) 语义阐发:核实所有的与数据字典不同等的表和列的名字。

3) 轮廓存储反省:反省数据字典,以确定该SQL语句的轮廓是否已经存在。

4) 天生履行计划:应用基于资源的优化规则和数据字典中的统计表来抉择最佳履行计划。

5) 建立二进制代码:基于履行计划,Oracle天生二进制履行代码。

一旦为履行筹备好了SQL语句,今后的履行将很快发生,由于Oracle认可同一个SQL语句,并且重用那些语句的履行。然而,对付天生特殊的SQL语句,或嵌入了翰墨变量的SQL语句的系统,SQL履行计划的天生光阴就很紧张了,并且前一个履行计划平日不能够被重用。对那些连接了很多表的查询,Oracle必要花费大年夜量的光阴来检测连接这些表的适当顺序。

评估表的连接顺序

在SQL语句的筹备历程中,花费最多的步骤是天生履行计划,分外是处置惩罚有多个表连接的查询。当Oracle评估表的连接顺序时,它必须斟酌到表之间所有可能的连接。例如:六个表的之间连接有720(6的阶乘,或6 * 5 * 4 * 3 * 2 * 1 = 720)种可能的连接线路。当一个查询中含有跨越10个表的连接时,排列的问题将变得更为显明。对付15个表之间的连接,必要评估的可能查询排列将跨越1万亿(准确的数字是1,307,674,368,000)种。

应用optimizer_search_limit参数来设定限定

经由过程应用optimizer_search_limit参数,你能够指定被优化器用来评估的最大年夜的连接组合数量。应用这个参数,我们将能够防止优化器耗损不定命量的光阴来评估所有可能的连接组合。假如在查询中表的数目小于optimizer_search_limit的值,优化器将反省所有可能的连接组合。

例如:有五个表连接的查询将有120(5! = 5 * 4 * 3 * 2 * 1 = 120)种可能的连接组合,是以假如optimizer_search_limit即是5(默认值),则优化器将评估所有的120种可能。optimizer_search_limit参数也节制着调用带星号的连接提示的阀值。当查询中的表的数目比optimizer_search_limit小时,带星号的提示将被优先斟酌。

另一个对象:参数optimizer_max_permutations

初始化参数optimizer_max_permutations定义了优化器所斟酌组合数目的上限,且依附于初始参数optimizer_search_limit。optimizer_max_permutations的默认值是80,000。

参数optimizer_search_limit和optimizer_max_permutations一路来确定优化器所斟酌的组合数目的上限:除非(表或组合数目)跨越参数optimizer_search_limit 或者 optimizer_max_permutations设定的值,否则优化器将天生所有可能的连接组合。一旦优化器竣事评估表的连接组合,它将选择资源最低的组合。

应用ordered提示指定连接顺序

你能够设定优化器所履行的评估数目的上限。然则纵然采纳有很高代价的排列评估,我们仍旧拥有使优化器可以尽早地放弃繁杂的查询的紧张时机。回顾一下含有15个连接查询的例子,它将有跨越1万亿种的连接组合。假如优化器在评估了80,000个组合后竣事,那么它才仅仅评估了0.000006%的可能组合,而且或许还没有为这个伟大年夜的查询找到最佳的连接顺序。

您可能还会对下面的文章感兴趣: