日期:2014-05-17  浏览次数:20814 次

返回排序结果第一行的最高效方法.
某表,对时间和一个流水号排序得到的语句为
select   *   from   sms   where   state=0   and   type=0   order   by   riqi,n
riqi为日期,N为随机的流水号,同一日期的N越小越靠前.
通过上面的方面可以得到一个按记录加入时间先后排序的记录集.
现在通过ADO方式想只取得这个记录集的第一条,已知的语句为
select   *   from   (select   *   from   sms   where   state=0   and   type=0   order   by   riqi,n)
      where   rownum=1
问题是这样需要把排序的记录全部列一遍然后取第一条,如果全部记录很多的时间效率会低,问有什么好办法,效率高一样.


------解决方案--------------------
select * from sms a,(select min(n) as n,riqi from sms where state=0 and riqi=(select min(riqi) from sms where state=0)) b where a.n=b.n and a.riqi=b.riqi;

不知可行否,同学习!

------解决方案--------------------
问题在于有WHERE条件,
类似这样的语句SELECT MIN(RIQI) FROM SMS WHERE STATE=0 AND TYPE=0,也是进行全表ACCESS
当数据量很多时,效率会低
------解决方案--------------------
第一:我觉得这语句的效率应该在用户可接受范围内,您应该测试执行时间后再考虑解决办法。
不能只凭想象。
第二:有一个不算很好的解决办法,当然效率会高。
建立另一张表,专门存储最小日期的最小n,只有一条记录,结构同主表一致。
在主表上建立AFTER INSERT OR UPDATE触发器,每次新增或更新的记录与最小记录存储表
相比较,如果比其小,则删除最小记录表并增加该条记录进去。如果比其大,则不变。
当需要用到最小记录时,直接从该表取值,保证效率最高。
注意:缺点是INSERT业务如果多的话,会影响日常业务效率。
------解决方案--------------------
其实即使用MS SQL的select top ...............,也会先对整个表排序,然后根据排序的结果取前几行。
因此,楼主要根据实际情况作判断,实在不行可以考虑在排序字段上建立索引。

另外,楼上说的方法虽然可行,但实际用处不大,针对即席查询总不可能面对每一个需求都去建一个表吧。
------解决方案--------------------
为提升效率,什么都要试试啊~~呵呵。
虽然我从来不这么做。
------解决方案--------------------
有没有试过利用分析函数来实现??

------解决方案--------------------
如果有大数据量的数据库,可以Toad的Optimize产生几个优化方案看一下.
------解决方案--------------------
我建议使用视图,最小号的视图,我想会提高效率