RSS
热门关键字:  虚拟主机技术  vps团购  discuz架构  虚拟主机团购  curl
当前位置 :| 团购首页>网站编程>MySql>

rownum和order by 以及index的关系

来源: 作者: 时间:2008-08-28 Tag: 点击:
本篇文章主要讨论rownum和排序以及索引的关系
问题1、rownum正序是指什么?
问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
问题3、rownnum与索引之间的关系?

-- Create table
create table DAIMIN
( ID       NUMBER not null,
  PARENTID NUMBER
);
alter table daimin add constraint pk_daimin primary key(id);

SQL> select *from DAIMIN;
        ID   PARENTID
---------- ----------
         1          6
         2          3
         5          1
         3          2


问题1、rownum正序是指什么?
    rownum正序是指rownum的返回是按照1,2,3依次递增,如上面的查询显示的效果

问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
下面执行两个语句进行比较:
SQL> select rownum as r, t.ID from daimin t order by t.ID;
         R         ID
---------- ----------
         1          1
         2          2
         3          3
         4          5
现象:是rownum是按照正序来返回的
        
该语句的执行计划如下:
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |       |       |       |
|   1 |  COUNT               |             |       |       |       |
|   2 |   INDEX FULL SCAN    | PK_DAIMIN   |       |       |       |
--------------------------------------------------------------------
现象:使用了PK_DAIMIN这个主键索引,并且从执行计划中看出COUNT操作之后没有SORT ORDER BY操作
     (Rownum事实上在COUNT (STOPKEY)时产生)

SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
         R   PARENTID
---------- ----------
         3          1
         4          2
         2          3
         1          6
现象:是rownum没有按照正序来返回

该语句的执行计划如下:
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |       |       |       |
|   1 |  SORT ORDER BY       |             |       |       |       |
|   2 |   COUNT              |             |       |       |       |
|   3 |    TABLE ACCESS FULL | DAIMIN      |       |       |       |
--------------------------------------------------------------------
现象:没有使用索引查询 ,并且在COUNT操作之后有SORT ORDER BY操作
分析:为什么这两句SQL语句返回的rownum不一样呢?
      主要是由于第一句使用了索引已经排好序,然后再产生Rownum,此时已经是按照parentid排好序的顺序,
      再按照parentid排序之后原来的rownum标识不会被打乱,所以返回的rownum是正序;
      而第二句则使用全表扫描,在全表扫面是查询出来的结果集是按照表中原有的记录的先后顺序来返回的,
      然后在COUNT操作时给返回的记录标记1,2,3,在标好标记之后再按照parentid字段排序,这样就将原来
      在COUNT时的顺序打乱,重新排序,所以返回的rownum不是正序。

问题3、rownnum与索引之间的关系?是不是建了某个字段的索引都会使用索引呢(在没有改字段的where条件的情况下)?
下面做测试试验:
给DAIMIN表中的PARENTID字段建索引
create index DM_PARENTID on DAIMIN (PARENTID);

select rownum as r, t.parentid from daimin t order by t.parentid;
其执行计划:
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |       |       |       |
|   1 |  SORT ORDER BY       |             |       |       |       |
|   2 |   COUNT              |             |       |       |       |
|   3 |    TABLE ACCESS FULL | DAIMIN      |       |       |       |
--------------------------------------------------------------------

查询结果:
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
         R   PARENTID
---------- ----------
         3          1
         4          2
         2          3
         1          6

分析:给parentid字段建了索引,但是该语句并没有使用索引,仍然采用的是全表扫描,所以返回的rownum仍然不是正序。


 


    由于各种原因,我们无法获知[rownum和order by 以及index的关系]原创作者,如侵犯了您的版权,请您及时联系我们!
上一篇:MySQL相关配置文件详解
下一篇:没有了
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册