首页 理论教育数据库性能管理与调优:部分范围处理的使用原则

数据库性能管理与调优:部分范围处理的使用原则

【摘要】:图5-5部分范围处理使用例子(二)以下是从两个表中分别提取生日和工资的SQL语句。为删除重复数据使用了UNION,因此无法执行部分范围处理。图5-6部分范围处理使用例子(三)按特定表的列顺序排序并显示多个表的连接结果时,如果要使用部分范围处理,可从以下两个方法中选择一个使用:在In-line view中对要排序的表进行 ORDER BY并用作 driving table以执行NESTED LOOP JOIN。

1)先处理对象范围较窄的条件始终更有利

进行部分范围处理时重要的是快速达到数组大小(array size)。为此,快速提取符合条件的数据非常重要。请参考以下例子:

(1)决定上述范围的条件中符合“AND i.itm_no BETWEEN 1 AND 10”的对象范围窄。

(2)决定上述范围的条件中符合“AND o.custno LIKE ‘5%’”的对象范围较广。

符合条件的HIT Ratio:

(1)如果首先读取符合上述(2)的条件的ORDER表后连接ITEM表,连接后符合(1)的条件的表非常少,为6个中的2个。因此命中率较低。

(2)如果首先读取符合上述(1)的条件的ITEM表后连接ORDER表,连接后符合(2)的条件的表较多,为3个中的2个。因此命中率较高。

图5-4 部分范围处理使用例子(一)

因此,先处理对象范围较窄的条件可提高命中率,保证良好的性能。

2)使用 UNION ALL代替 UNION

将两个以上的SQL结果合并为一个时使用UNION或UNION ALL,若要使用部分范围处理必须使用UNION ALL,如图5-5所示。

(1) UNION:为删除各个查询结果中重复的数据,必须执行排序操作。

(2) UNION ALL:显示结果时不移除各个查询结果中重复的数据。因此不会执行排序操作。

图5-5 部分范围处理使用例子(二)(www.chuimin.cn)

以下是从两个表中分别提取生日和工资的SQL语句。

为删除重复数据使用了UNION,因此无法执行部分范围处理。可按如下方法修改为:不移除重复数据的UNION ALL,从一开始为了使各个SQL的结果不重复,在第二个SQL中加上“AND生日<> 01-jan-70”,执行此操作后不必再进行排序,可快速确定初始数组大小。

3)应用 INLINE VIEW

应用 INLINE VIEW的部分范围处理使用例子,如图5-6所示。

图5-6 部分范围处理使用例子(三)

按特定表的列顺序排序并显示多个表的连接结果时,如果要使用部分范围处理,可从以下两个方法中选择一个使用:

(1)在In-line view中对要排序的表进行 ORDER BY并用作 driving table以执行NESTED LOOP JOIN。如:

注意:Inline view内的ORDER BY仅可用于Oracle 8i以上版本。

(2)对ORDER BY子句中的列生成组合索引并将item表用作driving table以执行NESTED LOOP JOIN。如: