12
返回列表 发新帖
楼主: fan_zhen_hua

oracle全表扫rownum来取记录的时候,不用扫整个表吗?

[复制链接]
招聘 : Java研发
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:19:06
11#
 楼主| 发表于 2010-3-17 13:37 | 只看该作者
OH。SORRY。。。版主要的是这个信息吧。
ops$oracle/PHPFORUM@PAY>set autotrace off
ops$oracle/PHPFORUM@PAY>col name for a30
ops$oracle/PHPFORUM@PAY>col value for 999999
ops$oracle/PHPFORUM@PAY>SELECT sn.name, ss.value
  2    FROM v$statname sn, v$sesstat ss
  3    WHERE sn.statistic# = ss.statistic#
  4      AND sn.name IN ('table fetch continued row')
  5    AND ss.sid = (select sid from v$mystat where rownum<=1);

NAME                             VALUE
------------------------------ -------
table fetch continued row            0

1 row selected.

Elapsed: 00:00:00.01
ops$oracle/PHPFORUM@PAY>set autotrace traceonly
ops$oracle/PHPFORUM@PAY>  select *
  2      from tbf_user t3
  3     where user_id in
  4           (select t2.user_id
  5              from (select T1.*, rownum linenum
  6                      from (select USER_ID from TBF_USER order by USER_ID) T1
  7                     where rownum <= 25020000) T2
  8             where linenum >= 25010000);

10001 rows selected.

Elapsed: 00:02:35.45

Execution Plan
----------------------------------------------------------
Plan hash value: 1662795728

--------------------------------------------------------------------------------------------
| Id  | Operation            | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |    25M|  2171M|       |   503K  (1)| 01:40:38 |
|*  1 |  HASH JOIN RIGHT SEMI|             |    25M|  2171M|   715M|   503K  (1)| 01:40:38 |
|   2 |   VIEW               | VW_NSO_1    |    25M|   429M|       |   196K  (1)| 00:39:17 |
|*  3 |    VIEW              |             |    25M|   691M|       |   196K  (1)| 00:39:17 |
|*  4 |     COUNT STOPKEY    |             |       |       |       |            |          |
|   5 |      VIEW            |             |    43M|   670M|       |   196K  (1)| 00:39:17 |
|   6 |       INDEX FULL SCAN| TBF_USER_PK |    43M|   670M|       |   196K  (1)| 00:39:17 |
|   7 |   TABLE ACCESS FULL  | TBF_USER    |    43M|  3058M|       | 94137   (2)| 00:18:50 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("USER_ID"="$nso_col_1")
   3 - filter("LINENUM">=25010000)
   4 - filter(ROWNUM<=25020000)


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     620686  consistent gets
     620548  physical reads
          0  redo size
     586239  bytes sent via SQL*Net to client
       1592  bytes received via SQL*Net from client
        102  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10001  rows processed

ops$oracle/PHPFORUM@PAY>set autotrace off
col name for a30
col value for 999999
SELECT sn.name, ss.value
ops$oracle/PHPFORUM@PAY>ops$oracle/PHPFORUM@PAY>ops$oracle/PHPFORUM@PAY>  2    FROM v$statname sn, v$sesstat ss
  3    WHERE sn.statistic# = ss.statistic#
  4      AND sn.name IN ('table fetch continued row')
  5    AND ss.sid = (select sid from v$mystat where rownum<=1);

NAME                             VALUE
------------------------------ -------
table fetch continued row           15

1 row selected.


------------------------------------------------------------------


ops$oracle/PHPFORUM@PAY>  set autotrace traceonly
ops$oracle/PHPFORUM@PAY>  select * from tbf_user where rownum < 25020000;

25019999 rows selected.

Elapsed: 00:08:09.62

Execution Plan
----------------------------------------------------------
Plan hash value: 3678947139

-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |    25M|  1741M| 53608   (2)| 00:10:44 |
|*  1 |  COUNT STOPKEY     |          |       |       |            |          |
|   2 |   TABLE ACCESS FULL| TBF_USER |    25M|  1741M| 53608   (2)| 00:10:44 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<25020000)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
     480172  consistent gets
     229148  physical reads
          0  redo size
1106747637  bytes sent via SQL*Net to client
    2752681  bytes received via SQL*Net from client
     250201  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
   25019999  rows processed

ops$oracle/PHPFORUM@PAY>  set autotrace off
ops$oracle/PHPFORUM@PAY>col name for a30
ops$oracle/PHPFORUM@PAY>col value for 999999
ops$oracle/PHPFORUM@PAY>SELECT sn.name, ss.value
  2    FROM v$statname sn, v$sesstat ss
  3    WHERE sn.statistic# = ss.statistic#
  4      AND sn.name IN ('table fetch continued row')
  5    AND ss.sid = (select sid from v$mystat where rownum<=1);

NAME                             VALUE
------------------------------ -------
table fetch continued row            0

1 row selected.

Elapsed: 00:00:00.01

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
12#
发表于 2010-3-18 05:10 | 只看该作者
Did you change table TBF_USER between the two tests? I don't understand why the second row count is 25M on line 2 (TABLE ACCESS FULL)? It should still be 43M.

A simpler case to test our theory is:

create table testlong (x int, y long);
--my db_block_size is 4, so 5000 bytes is enough to cause a row to chain
insert into testlong values (1, rpad('x', 5000));
insert into testlong values (2, rpad('x', 5000));
insert into testlong values (3, rpad('x', 5000));
commit;
--confirm chained_rows
analyze table testlong list chained rows;
select * from chained_rows;
--In my 10gR2, 'table fetch continued row' statistic# is 252
--Get base value
select value from v$mystat where statistic# = 252;
select * from testlong where rownum < 2;
--Should increase by 1
select value from v$mystat where statistic# = 252;
--Run the two above queries a few times

--Add rownum stop key
select count(*) from select * from testlong where rownum < 2);
--stat value should not increase because of this rownum optimization; you can change 2 to 3 and it won't change either
select value from v$mystat where statistic# = 252;

If you check v$mystat, there's no need to join with v$sesstat.

Yong Huang

[ 本帖最后由 Yong Huang 于 2010-3-17 15:45 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表