曾经做过一个项目---外汇交易管理系统。
其中有一个报价功能,需要保存一个月的数据集,数据量差不多2千多万条,当然查询的时候,自然会造成低速率,连接超时问题,甚至会造成程序出错!如何解决这些问题呢?
答案是创建索引和优化SQL语句!
下边讲一下怎样创建索引?
t_priceinfo------报价表,其中有两千多万条数据!
priceid ------相当于一个表的主键,但并不是主键!
intime ------报价的时间!
以下是SQL语句
select * from t_priceinfo where priceid>=(select max(priceid) from t_priceinfo)-56 and priceid<=(select max (priceidfrom t_priceinfo)-28 order by intime desc
先分析一下这个SQL语句。
这个SQL语句涉及到分页问题,暂且不管这个。
造成查询速度慢,从SQL语句来看,无非是两个因素引起的 -----max 和 order by
max 函数,其实从oracle中的内部机制来讲,它应该是对字段进行进行排序,然后在从排好序的数据中迅速找出最大值,这里应该涉及到有关数据结构的问题。假设你没有对该字段创建索引,那么在查询时会在一群无序的字段中找出最大值,显然是相当不容易的,自然会造成速度一慢再慢,但若是先对字段创建索引呢,显而易见,最大值的查询也就易如反掌了,速度自然居高不下。。
order by 也是对某个字段进行排序,这显然在数据量大的时候会造成时间浪费问题,效率就不用提了,还不如直接对其创建索引,排序由oracle 内部机制来实现。
同样一个SQL语句,在没有对priceid 和intime创建索引前,导致查询超时,程序返回不了数据,以致出错。但是创建索引后,查询速度一高再高,程序运行起来犹如翻云覆水,哈哈。。。
总结,在遇到针对大量数据的某个字段采用聚合函数时,要考虑使用创建索引,这是提高速度的一个相当好的办法。。。嘿嘿。。。