首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle Rownum SQL

Oracle Rownum SQL
EN

Stack Overflow用户
提问于 2011-07-02 06:13:38
回答 2查看 1.9K关注 0票数 0

这两种编码技术的区别(优点和缺点)是什么?

代码语言:javascript
复制
select * from (
    select rownum rnun, * from table where rownum < x
) where rnum > y


select * from (
    select * from table
) where rownum < x and x > y
EN

回答 2

Stack Overflow用户

发布于 2011-07-02 07:19:56

这两个查询返回不同的行。

这两个查询都不是确定性的。因此,这两个查询都不应该在实际系统中使用。

第一个查询似乎至少是试图生成一个包含行(x和y之间的行)的窗口。但是,由于没有ORDER BY,行的顺序是不确定的,并且窗口可能不会执行您想要的操作。

第二个查询返回任意x行数据(假设x> y)。否则返回0行(如果y >= x)。如果您正在尝试构建某种窗口查询,则不是这样的。

如果您想要一个有效的窗口查询,您需要类似这样的东西

代码语言:javascript
复制
SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y

如果你想使用ROWNUM,你需要类似这样的东西

代码语言:javascript
复制
SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x

但这往往比分析查询方法的效率低。

票数 4
EN

Stack Overflow用户

发布于 2011-07-03 18:11:39

除了没有“order by”子句…。。可能是关于Oracle STOPKEY功能的问题?在“分页”查询的情况下,Oracle可以使用STOPKEY特性来限制子查询中的行数,这可以带来一定的性能提升。

看看这个查询:

代码语言:javascript
复制
select *
  from (select a.*,
               row_number() over (order by sname) rnum
          from t_patient_card a)
 where rnum between 1 and 100           

                                                        Cost    Cardinality

SELECT STATEMENT, GOAL = FIRST_ROWS                     313272  3571266
 VIEW        HOSPITAL2$                                 313272  3571266
  SORT ORDER BY                                         313272  3571266
   COUNT
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266

Oracle之前读取的所有行仅返回其中的100行

让我们像这样重写查询:

代码语言:javascript
复制
select *
  from (
  select rownum as rn,tt.*  from  
  (
   select  t.* from t_patient_card t order by  t.sname
  )tt where rownum<100       
    ) 
 WHERE rn >1

在本例中,我们在子查询中使用rownum<100来通知优化器,我们希望得到的行数少于100行。

代码语言:javascript
复制
                                                        Cost    Cardinality
SELECT STATEMENT, GOAL = ALL_ROWS                       313272  99
 VIEW    HOSPITAL2$                                     313272  99
  COUNT STOPKEY
   VIEW    HOSPITAL2$                                   313272  3571266
    SORT ORDER BY STOPKEY                               313272  3571266
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266

你可以看到“count stopkey”,基数只有99,在这个step.In之后,我的数据库第二次查询比第一次快了一秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6553712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档