这两种编码技术的区别(优点和缺点)是什么?
select * from (
select rownum rnun, * from table where rownum < x
) where rnum > y
select * from (
select * from table
) where rownum < x and x > y发布于 2011-07-02 07:19:56
这两个查询返回不同的行。
这两个查询都不是确定性的。因此,这两个查询都不应该在实际系统中使用。
第一个查询似乎至少是试图生成一个包含行(x和y之间的行)的窗口。但是,由于没有ORDER BY,行的顺序是不确定的,并且窗口可能不会执行您想要的操作。
第二个查询返回任意x行数据(假设x> y)。否则返回0行(如果y >= x)。如果您正在尝试构建某种窗口查询,则不是这样的。
如果您想要一个有效的窗口查询,您需要类似这样的东西
SELECT *
FROM (SELECT a.*,
row_number() over (order by something) rnum
FROM table_name)
WHERE rnum BETWEEN x AND y如果你想使用ROWNUM,你需要类似这样的东西
SELECT *
FROM (SELECT a.*,
rownum rnum
FROM( SELECT b.*
FROM table_name
ORDER BY something) a)
WHERE rownum < y
AND rnum > x但这往往比分析查询方法的效率低。
发布于 2011-07-03 18:11:39
除了没有“order by”子句…。。可能是关于Oracle STOPKEY功能的问题?在“分页”查询的情况下,Oracle可以使用STOPKEY特性来限制子查询中的行数,这可以带来一定的性能提升。
看看这个查询:
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 3571266Oracle之前读取的所有行仅返回其中的100行
让我们像这样重写查询:
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行。
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之后,我的数据库第二次查询比第一次快了一秒。
https://stackoverflow.com/questions/6553712
复制相似问题