WEB开发网
开发学院数据库Oracle rownum和order by以及index的关系 阅读

rownum和order by以及index的关系

 2008-09-01 12:46:07 来源:WEB开发网   
核心提示: 查询结果:SQL>selectrownumasr,t.parentidfromdaimintorderbyt.parentid;RPARENTID11223346分析:将parentid字段设置为not null字段之后,由于在order by parentid时会采用parenti

查询结果:

   SQL>selectrownumasr,t.parentidfromdaimintorderbyt.parentid;
  RPARENTID
  --------------------
  11
  22
  33
  46

分析:将parentid字段设置为not null字段之后,由于在order by parentid时会采用parentid字段的索引DM_PARENTID,

所以改语句查询出来的rownum的顺序是正序。

问题:为什么给parentid字段设置为not null字段之后,此时该查询语句会使用索引呢(在没有该字段的where条件时)?

这里主要是牵涉到order by使用索引的条件,什么情况下order by会使用索引?

order by 使用索引是有条件的:

1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

2)ORDER BY中所有的列必须定义为非空.

3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引

上面的试验是满足了ORDER BY中列parentid为非空,所以order by parentid使用parentid字段的索引。

对于复合索引:

create index DM_INDEX on DAIMIN (ID, PARENTID);

以下几句都使用了索引:

   Selectrownum,t.*fromDAIMINtorderbyID,PARENTID;--使用复合索引DM_INDEX
  selectrownum,t.*fromDAIMINtorderbyt.IDdesc,t.PARENTIDdesc;--使用复合索引DM_INDEX
  Selectrownum,t.*fromDAIMINtorderbyID;--使用主键索引
  Selectrownum,t.*fromDAIMINtorderbyIDdesc;--使用主键索引

以下几句不使用索引:

   selectrownum,t.*fromDAIMINtorderbyt.IDasc,t.PARENTIDdesc;--不使用复合索引DM_INDEX,全表扫描
  Selectrownum,t.*fromDAIMINtorderbyPARENTID;

(该句parentid字段还没有设置为not null时,只有复合索引DM_INDEX,此时不使用复合索引)

总结:

1)默认情况是按顺序先取rownum,再order by

2)如果order by 满足使用索引的情况,则先order by,再取rownum

order by 使用索引是有条件的:

1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

2)ORDER BY中所有的列必须定义为非空.

3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引

上一页  1 2 3 4 

Tags:rownum order by

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接