前端之家收集整理的这篇文章主要介绍了
Oracle提高SQL执行效率的3种方法,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Oracle提供了多种方法用于减少花在剖析Oracle sql表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能。现在我们来简要地看看这些方法中的几种。
1、使用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子句所列出的顺序来评估表格。
2、使用theordered_predicates
ordered_predicates
提示在
查询的WHERE子句里指定的,并被用来指定布尔判断(Boolean predicate)被评估的顺序。在没有ordered_predicates的情况下,Oracle会使用下面这些步骤来评估
sql判断的顺序: 子
查询的评估先于外层WHERE子句里的Boolean条件。 所有没有内置
函数或者子
查询的布尔条件都按照其在WHERE子句里相反的顺序进行评估,即最后一条判断最先被评估。 每个判断都带有内置
函数的布尔判断都依据其预计的评估值按递增排列。 你可以使用ordered_predicates
提示来强制取代这些缺省的评估规则,那么你WHERE子句里的项目就会按照其在
查询里出现的顺序被评估。在
查询的WHERE子句里使用了PL/
sql函数的情况下,通常会使用ordered_predicates
提示。如果你知道限制最多的判断并且希望Oracle最先评估这些判断的时候,在这种情况下,它也是非常有用的。
用法提示:你不能使用ordered_predicates
提示来保存对索引键进行判断评估的顺序。
3、限制表格合并评估的数量
提高
sql剖析
性能的最后一种
方法是强制取代Oracle的一个参数,这个参数控制着在评估一个
查询的时候,基于消耗的优化器所评估的可能合并
数量。 optimizer_search_limit这个参数会指定表格合并组合的最大
数量,后者将会在Oracle试图确定合并多表格最佳方式的时候被评估。这个参数有助于防止优化器花更多的时间来评估可能的合并顺序,而不是把时间花在寻找最佳合并顺序上。optimizer_search_limit还控制着用于
调用star join
提示的阙值,当
查询里的表格
数量低于optimizer_search_limit(其缺省的值是5)的时候,star
提示就会被光顾。
原文链接:https://www.f2er.com/oracle/65446.html