快捷搜索:

用智能优化限制提高Oracle数据库性能(1) - Ora

Oracle SQL运行光阴的最主要的组成部分是花在为履行筹备新的SQL语句上的光阴。不过,假如懂得了可履行计划孕育发生的内在机制,你就可以节制Oracle花费在评估表的连接顺序的光阴,并在总体上前进查询的机能。

筹备为履行供给的SQL语句

在一个SQL语句进入Oracle库的cache之后、而真正被履行之前,将会依次发生如下事故:

语法反省——反省该SQL语句的拼写和词序是否精确。

语义解析——Oracle根据数据词典(data dictionary)来验证所有的表格(table)和列(column)。

已保存纲要反省——Oracle反省词典以确认对应该SQL语句是否已存在已保存的纲要(Stored Outline)。

孕育发生履行计划——Oracle根据一种罚值(cost-based)优化算法和数据词典中的统计数据来抉择若何天生最优履行计划。

孕育发生二进制代码——Oracle在履行计划的根基上天生可履行的二进制代码。

一旦开始筹备履行SQL语句,上述的历程很快就会履行,这是由于Oracle可以识别出同样的SQL语句并对同样的SQL语句重复应用对应的可履行代码。然而,对孕育发生ad hoc SQL的系统以及SQL中嵌入文本值(literal value)的环境,SQL履行计划的天生光阴就会变得相称长,而且曩昔的履行计划也经常不能被再次使用。对那些扳连到许多表格的查询,Oracle可能要花上很长的光阴来抉择把连接这些表格的顺序。

评估连接表格的顺序

天生可履行计划的光阴每每是SQL的筹备历程中最大年夜的开销组成部分,尤其是在处置惩罚有多个表的连接的查询的环境下。当Oracle评估表的连接顺序时,它必须斟酌每一种可能的排序。例如,当有六个表格必要连接时,Oracle必要斟酌720种(6的排列数,即6×5×4×3×2×1=720)可能的连接排序。当必要连接的表的数量跨越10时,这个排列问题将变得异常凸起:假如必要连接的表格有15个,那么必要斟酌的可能的查询排列顺序跨越一万亿种(正确值为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参数还用来节制启动开始连接唆使(star join hint)的阈值。当查询所涉及的表格数量少于参数optimizer_search_limit的设定值,开始连接唆使将被设置。

另一个对象:optimizer_max_permutations参数

optimizer_max_permutations初始参数用来设定优化器优化范围的上界(即最多斟酌若干种表格连接顺序),它依附于初始参数optimizer_search_limit。参数optimizer_max_permutations的默认值为8000。

参数optimizer_search_limit 和optimizer_max_permutations一同用来设置优化器所斟酌的排列数的上限。优化器赓续的孕育发生可能的表的连接的排列,直到排列数达到参数optimizer_search_limit或者optimizer_max_permutations为止。一旦优化器竣事孕育发生新的可能连接排列,它将会从中选择出消费最小的排列。

用已排序唆使来指定一种连接排序

你可以设定优化器评估的排列数的上限。然则对繁杂的环境下,纵然容许的排列数很大年夜,优化器也很可能在远远没有找到一个对拍照宜的排列之间就已经竣事优化了。你不妨转头看看我前面举的那个例子(15个必要连接的表有跨越一万亿种排列)。假如设定优化器斟酌80,000种排列,那么这仅仅斟酌了所有可能性的0.000006%,优化器极可能没有达到最佳的排列。

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