某表,对时间和一个流水号排序得到的语句为
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
问题是这样需要把排序的记录全部列一遍然后取第一条,如果全部记录很多的时间效率会低,问有什么好办法,效率高一样.

解决方案 »

  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; 不知可行否,同学习!
      

  2.   

    问题在于有WHERE条件,
    类似这样的语句SELECT MIN(RIQI) FROM SMS WHERE STATE=0 AND TYPE=0,也是进行全表ACCESS
    当数据量很多时,效率会低
      

  3.   

    第一:我觉得这语句的效率应该在用户可接受范围内,您应该测试执行时间后再考虑解决办法。
    不能只凭想象。
    第二:有一个不算很好的解决办法,当然效率会高。
    建立另一张表,专门存储最小日期的最小n,只有一条记录,结构同主表一致。
    在主表上建立AFTER INSERT OR UPDATE触发器,每次新增或更新的记录与最小记录存储表
    相比较,如果比其小,则删除最小记录表并增加该条记录进去。如果比其大,则不变。
    当需要用到最小记录时,直接从该表取值,保证效率最高。
    注意:缺点是INSERT业务如果多的话,会影响日常业务效率。
      

  4.   

    其实即使用MS SQL的select top ...............,也会先对整个表排序,然后根据排序的结果取前几行。
    因此,楼主要根据实际情况作判断,实在不行可以考虑在排序字段上建立索引。另外,楼上说的方法虽然可行,但实际用处不大,针对即席查询总不可能面对每一个需求都去建一个表吧。
      

  5.   

    如果有大数据量的数据库,可以Toad的Optimize产生几个优化方案看一下.