Oracle语句优化规则汇总(6)

豆豆网   技术应用频道   2008年02月19日  【字号: 收藏本文

本文详细介绍Oracle语句优化规则汇总(6)

  虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低!

  5. 强制索引失效

  如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) .

  举例:

  SELECTENAME
  FROMEMP
  WHEREEMPNO=7935
  ANDDEPTNO+0=10/*DEPTNO上的索引将失效*/
  ANDEMP_TYPE||‘’=‘A’/*EMP_TYPE上的索引将失效*/

  这是一种相当直接的提高查询效率的办法。 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它。

  这里有一个例子关于何时采用这种策略,

  假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有索引。

  SELECTENAME
  FROMEMP
  WHEREEMP_TYPE=‘A’
  ANDEMP_CLASS=‘X’;

  优化器会注意到EMP_TYPE上的索引并使用它。 这是目前唯一的选择。 如果,一段时间以后, 另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并。 然而,如果其中一个索引(EMP_TYPE)接近于唯一性而另一个索引(EMP_CLASS)上有几千个重复的值。 排序及合并就会成为一种不必要的负担。 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引。

  用下面的方案就可以解决问题。

  SELECTENAME
  FROMEMP
  WHEREEMP_TYPE=‘A’
  ANDEMP_CLASS||‘’=‘X’;

来源:豆豆网转载    作者:IT专家网 Peak Wong    责编:豆豆技术应用

正在加载评论...