在 Oracle 里加快 SQL 执行的三种方法
Oracle 提供了多种方法用于减少花在剖析 Oracle SQL 表达式上的时间,在执行带
有大量执行计划的复杂查询时剖析过程会拖累系统的性能。现在我们来简要地看看这些方
法中的几种。
使用 ordered 提示
Oracle 必须花费大量的时间来剖析多表格的合并,用以确定表格合并的最佳顺序。
如果 SQL 表达式涉及七个乃至更多的表格合并,那么有时就会需要超过 30 分钟的时间来
剖析,因为 Oracle 必须评估表格合并所有可能的顺序。八个表格就 会有 40,000 多种顺
序。Ordered 这个提示(hint)和其他的提示一起使用能够产生合适的合并顺序。
Ordered 这个提示会要求列在 SQL 表达式 FROM 字句里的表格按照指定的顺 序进
行合并,FROM 字句里的第一个表格会指定驱动表格(driving table)。驱动表格应该是
返回最小行数的表格。使用 ordered 提示会跳过非常耗时和耗资源的剖析操作,并加快
Oracle SQL 的执行。
Listing A 如下:
Listing A
select /*+ ordered use_nl(bonus)
parallel(e, 4) */ e.ename, hiredate, b.comm from emp e,
bonus b
where e.ename = b.ename ;
Listing A 里是一个复杂查询的例子,这个查询被强制进行一个嵌套循环,从而与对
emp 表格进行的并行查询合并。要注意,我已经使用 ordered 提示来引导 Oracle 去按照
WHERE 子句所列出的顺序来评估表格。
使用 theordered_predicates
ordered_predicates 提示在查询的 WHERE 子句里指定的,并被用来指定布尔判断
(Boolean predicate)被评估的顺序。在没有 ordered_predicates 的情况下,Oracle
会使用下面这些步骤来评估 SQL 判断的顺序:
子查询的评估先于外层 WHERE 子句里的 Boolean 条件。
所有没有内置函数或者子查询的布尔条件都按照其在 WHERE 子句里相反的顺序进行
评估,即最后一条判断最先被评估。
每个判断都带有内置函数的布尔判断都依据其预计的评估值按递增排列。
评论10
最新资源