where与order by的执行顺序?

超叔csdn 2005-09-21 02:29:22
它们两个哪个先执行?
特别是对于where rownum<10 order by ...之类的情况.
感觉有时是先排序后取ROWNUM,有时是先取ROWNUM后排序.
好像与ORDER BY后面的字段有很大的关系?

求大侠给我一个详细的解答?
...全文
3235 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
章无忌 2005-09-23
  • 打赏
  • 举报
回复
回复人: wbdx(碳离子) ( ) 信誉:100 2005-9-22 9:44:29 得分: 15
还有这种事情? GZ
----------------
瞧这帖分数给的...巨受打击 ToT
yuqinghe 2005-09-22
  • 打赏
  • 举报
回复
不对呀,我刚才试了一下,数据结果是一样的
超叔csdn 2005-09-22
  • 打赏
  • 举报
回复
我想你应该说的对吧.
我的那个表,虽然两个SQL检索的记录不同,但我在不同的时间用两个中的某一条语句检索的记录还是一定的.
希望大家多做试验,多交流一下,我暂不结帖.3天后结!
章无忌 2005-09-22
  • 打赏
  • 举报
回复
,ORACLE有一个优化器(Optimizer),ORACLE的优化机理就是从Optimizer开始的。

明确两个概念:Optimizer 对ORACLE的优化方式有两种,一种是基于规则的,我们称为RBO(Rule-Based Optimization),一种是基于代价的CBO(Cost-Based Optimization),我们从字面就可基本理解这两个优化方式的含义,不错,RBO是根据ORACLE的内定规则实现的,比如我在“ORACLE性能调优原则”中讲到的:索引,索引就是ORACLE的内定规则;而对于CBO,由于是基于代价的,也就是ORACLE机器的资源了,比如CPU和内存等,这个时候有朋友就问了,既然有这两个方式,那ORACLE到底如何选择呢,其实,这个问题有一半需要我们自己回答,有一半由ORACLE回答。因为我们在安装ORACLE时就已决定了ORACLE到底调用什么方式,这个就是init.ora中设定的OPTIMIZER_MODE参数,如果我们设为OPTIMIZER_MODE=RULE,它就会按RBO方式进行,反之按CBO了。当然,我们在开发程序时也可认为的改变规则,如SQL:

SELECT /*RULE*/ * FROM TABLE_NAME ,这个就使ORACLE强制使用RBO规则了,当然,ORACLE也比较“聪明”,它会根据用户检索表和该表的索引的统计信息来选择优化方式了,这里就出现了一个问题了,如果统计信息是陈旧的或者说是错误的,我们就必须用analyze人为的对表和索引进行重新统计了
wbdx 2005-09-22
  • 打赏
  • 举报
回复
还有这种事情? GZ
章无忌 2005-09-22
  • 打赏
  • 举报
回复
和数据库优化器是ROB或COB模式也有关系..
waterfirer 2005-09-22
  • 打赏
  • 举报
回复
我遇到过一个表的数据(没有改动过)在两个时间内查出的顺序不一样。
查询语句就是select * from tablename
这种情况只遇到过一次,以后就没遇到过了。

sbaz(万神渡劫),你那个表一直这样吗?
超叔csdn 2005-09-22
  • 打赏
  • 举报
回复
我的那个表没有索引
WHERE处也没有其它字段.
解决方法我知道!ROW_NUMBER()OVER(),RANK()OVER(),DENSE_RANK()OVER()我都会用.
我只是发现了这么一个怪现象,请大家来参详一下而已!
章无忌 2005-09-22
  • 打赏
  • 举报
回复
似乎和你的where处字段是否有索引有关系
如果该sql不用索引,full table scan会根据数据的物理储存位置(一般先输入的先取出)取出在排序
有索引,index range scan,那么取出来的值本来就有一定逻辑顺序,再排序的效果和上者就不太一样了
超叔csdn 2005-09-22
  • 打赏
  • 举报
回复
你多试一下吧,你用ORDER BY ... DESC可能结果都不一样呢,不信你试.
不过你的数据要多点才行!
章无忌 2005-09-21
  • 打赏
  • 举报
回复
排序+取前多少条的数据还是这样解决比较保险:
1.Select * From (
Select test.*, rank() over(Partition By monthid Order By gz Desc) rk From test)
Where rk = 10
----oracle支持rank函数
2.
select * from test a
where (select count(*) from test b where a.gz < b.gz and a.monthid = b.monthid) < 11
超叔csdn 2005-09-21
  • 打赏
  • 举报
回复
可惜的是没有其它的条件,不信你可以自己多造几条数据试试自己的表.
我的表太大了,有80多个字段.所以不方便写出来.本来这个SQL与项目无关,是我自己发现了这个问题.
难道你们没出现过吗?
waterfirer 2005-09-21
  • 打赏
  • 举报
回复
你是还有其他条件吧,如
select * from tbi_sa06
where ...>... and rownum<10
order by crd_depriv_mgt_no
这种情况下可能会不一样的
超叔csdn 2005-09-21
  • 打赏
  • 举报
回复
而它也并不是先排序了后取10条的记录.
于是才来请教各位大侠!
超叔csdn 2005-09-21
  • 打赏
  • 举报
回复
对于我的数据库的一个表,我用
select * from tbi_sa06
where rownum<10
order by crd_no

select * from tbi_sa06
where rownum<10
order by crd_depriv_mgt_no
所查询的记录是不一样的.我的表的记录有40多条.
超叔csdn 2005-09-21
  • 打赏
  • 举报
回复
其实我一直也是这么想的,包括上面这位大哥的方法我都知道.
但由于我查询的过程中出现了这样一来的现象.
如果先取值后排序,那么对于20条记录,ORDER BY任何字段都会得到同样的记录,哪怕顺序不同.
但我用了ORDER BY 不同的字段,居然得到的是不同的记录,于是才有这种疑惑了.
qiaozhiwei 2005-09-21
  • 打赏
  • 举报
回复 1
给个例子你看下就清楚了:
SQL> select * from aaa_csdn_1;

ID
----------
9999
2423
434
5412
6532

SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5);

ID
----------
9999
2423
434
5412

SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5) ORDER BY ID;

ID
----------
434
2423
5412
9999
注意:此处没有取得 6532的记录,说明是先取记录 后 排序的

得到先排序 后 取前4个
SQL> SELECT * FROM (SELECT * FROM AAA_CSDN_1 ORDER BY ID) WHERE ROWNUM < 5;

ID
----------
434
2423
5412
6532
waterfirer 2005-09-21
  • 打赏
  • 举报
回复
如果想先排序后取值就这样
select * from (select * from t order by ...) where rownum<10
waterfirer 2005-09-21
  • 打赏
  • 举报
回复
先取值后排序,这一点好像和sqlserver不一样
sunxb008 2005-09-21
  • 打赏
  • 举报
回复
应该是先取rownum<10的集合,然后在按 ORDER BY 的字段进行排序

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧