某表,对时间和一个流水号排序得到的语句为
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 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 MIN(RIQI) FROM SMS WHERE STATE=0 AND TYPE=0,也是进行全表ACCESS
当数据量很多时,效率会低
不能只凭想象。
第二:有一个不算很好的解决办法,当然效率会高。
建立另一张表,专门存储最小日期的最小n,只有一条记录,结构同主表一致。
在主表上建立AFTER INSERT OR UPDATE触发器,每次新增或更新的记录与最小记录存储表
相比较,如果比其小,则删除最小记录表并增加该条记录进去。如果比其大,则不变。
当需要用到最小记录时,直接从该表取值,保证效率最高。
注意:缺点是INSERT业务如果多的话,会影响日常业务效率。
因此,楼主要根据实际情况作判断,实在不行可以考虑在排序字段上建立索引。另外,楼上说的方法虽然可行,但实际用处不大,针对即席查询总不可能面对每一个需求都去建一个表吧。