oracle数据库优化:用智能优化限制提高Oracle数据库性能来源: 发布时间:星期六, 2009年2月21日 浏览:0次 评论:0
="t18">
Oracle SQL运行时间最主要组成部分是花在为执行预备新SQL语句上时间不过假如了解了可执行计划产生内在机制你就可以控制Oracle花费在评估表连接顺序时间并在总体上提高查询性能
预备为执行提供SQL语句
在个SQL语句进入Oracle库cache的后、而真正被执行的前将会依次发生如下事件:
语法检查——检查该SQL语句拼写和词序是否正确
语义解析——Oracle根据数据词典(data dictionary)来验证所有表格(table)和列(column)
已保存纲要检查——Oracle检查词典以确认对应该SQL语句是否已存在已保存纲要(Stored Outline)
产生执行计划——Oracle根据种罚值(cost-based)优化算法和数据词典中统计数据来决定如何生成最优执行计划
产生 2进制代码——Oracle在执行计划基础上生成可执行 2进制代码
旦开始预备执行SQL语句上述过程很快就会执行这是Oracle可以识别出同样SQL语句并对同样SQL语句重复使用对应可执行代码然而对产生ad hoc SQL系统以及SQL中嵌入文本值(literal value)情况SQL执行计划生成时间就会变得相当长而且以前执行计划也经常不能被再次利用对那些牵涉到许多表格查询Oracle可能要花上很长时间来决定把连接这些表格顺序
评估连接表格顺序
生成可执行计划时间往往是SQL预备过程中最大开销组成部分尤其是在处理有多个表连接查询情况下当Oracle评估表连接顺序时它必须考虑每种可能排序例如当有 6个表格需要连接时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那么优化器检查所有可能表连接方式
例如涉及了 5个表查询共有120种(5!=5×4×3×2×1=120)可能连接顺序所以假如参数optimizer_search_limit值设置为5(默认值)那么优化器就会考虑所有这120种可能连接顺序optimizer_search_limit参数还用来控制启动开始连接指示(star join h)阈值当查询所涉及表格数量少于参数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个需要连接表有超过万亿种排列)假如设定优化器考虑80000种排列那么这仅仅考虑了所有可能性0.000006%优化器极可能没有达到最佳排列
在Oracle SQL中解决这个问题最好思路方法就是手工指定种表格连接顺序这里需要遵循大原则就是表格连接顺序应该使得查询计划尽快得以建立通常在SQL语句中使用WHERE限制子句
下面以个对名为emp表格并行查询为例例子中代码强制查询计划执行个嵌套循环连接(nested loop join)注重我使用了已排序指示来引导优化器来评估WHERE子句中给出表格连接顺序
0
相关文章读者评论发表评论 |