rownum和order by以及index的关系
2008-09-01 12:46:07 来源:WEB开发网查询结果:
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 条件中出现,也会使用索引
赞助商链接