用智能优化限制提高Oracle数据库性能
2007-05-11 12:23:17 来源:WEB开发网在Oracle SQL中解决这个问题的最好方法就是手工指定一种表格连接顺序。这里需要遵循的大原则就是表格连接顺序应该使得查询计划尽快得以建立,通常在SQL语句中使用WHERE限制子句。
下面以一个对名为emp的表格的并行查询为例,例子中的代码强制查询计划执行一个嵌套循环连接(nested loop join)。注意,我使用了已排序指示来引导优化器来评估WHERE子句中给出的表格的连接顺序。 select /*+ ordered use_nl(bonus) parallel(e, 4) */
e.ename,
hiredate,
b.comm.
from
emp e,
bonus b
where
e.ename = b.ename
;
上面的例子要求优化器按照SQL语句中FROM子句指定的顺序连接表格,FROM子句中第一个的表格指定为驱动表格(driving table)。已排序指示常常与其它指示联合使用以确保多个表格按照适当的顺序连接起来。在遇到涉及四个以上表格的数据仓库查询时常常也是这样处理。
下面另给出一个例子,在这个例子中,我们使用一个已排序指示(ordered hint)来把表格按照一个特定的顺序(先是emp,然后是dep和sal,最后是bonus)连接起来。进一步改进执行计划,我指定emp表格到dept表格的连接使用hash连接,sal表格到bonus表格使用嵌套循环连接。 select /*+ ordered use_hash (emp, dept) use_nl (sal, bonus) */
from
emp,
dept,
sal,
bonus
where . . .
对实际应用的建议
在实际应用场合下,减小optimizer_max_permutations参数并使用已保存的优化计划或者已保存纲要(这样在查询涉及到许多表格时,就可以避免重新解析查询所花费的实际)会更有效率。一旦找到最好的表格连接顺序,你可以手工指定表格的连接顺序(通过已排序指示)并保存纲要,这样就永久保存该表格连接顺序。
当执行一个新的查询时,你可以首先把optimizer_search_limit设置为该查询所涉及的表格数,这样优化器将从所有的连接顺序中找出最佳的那种。以后执行该查询时,你就可以在WHERE子句中按照最佳连接顺序排列表格名称,并设置已保存指示和已保存纲要,这样就可以按照最佳顺序连接表格而无需重复评估各种可能排序。这样查询的速度将会得到显著的提高。
已排序指示的优先级高于optimizer_search_limit和 optimizer_max_permutations参数。如果设置了已排序指示,那么表格就会按照查询命令中的FROM子句给出的顺序连接,这样这个过程就没有优化器优化表格的连接顺序这一步骤了。
作为Oracle的专业人士,你应该知道SQL语句进入库cache中有一个明显的起始延时。但是聪明的Oracle数据库管理员以及Oracle开发者能改变表格的搜索限制参数或者利用已排序指示来手工指定表格的连接顺序,这样可以极大的降低优化以及执行新查询所花费的时间。
更多精彩
赞助商链接