当前位置: 代码迷 >> Oracle管理 >> 请问优化一个sql查询
  详细解决方案

请问优化一个sql查询

热度:181   发布时间:2016-04-24 04:06:42.0
请教优化一个sql查询
现在我在做一个关于分析公交站点的功能,就是利用乘客刷卡的时间与车上gps到站时间做对比,从而得出这个乘客是在哪个站点刷卡的。
刷卡记录表:card
    id                          tdate                      line          car_id       station
1447647     2014-11-24 12:27:00          301         13913
1447648    2014-11-24 11:56:00           906          24470

gps到站明细表:gps_time
   id                          tdate                    line          car_id       station
44566        2014-11-24 12:27:30        301         13913          清晖园
44567        2014-11-24 12:24:30        306         25513          客运总站
44568        2014-11-24 12:27:30        301         13913          乐购
44569        2014-11-24 12:28:47        924         34407          文化公园
44570        2014-11-24 12:30:08        301         13913          新世界

我的思路是以card表每条记录为单位,比如id=1447647这条刷卡记录,根据车牌号检索gps_time表中这台车最接近刷卡时间的记录,即可得出该上客的站点。
sql语句已经写好,可以查询到希望的结果,但是运行速度慢,需要2.5秒,请教各位大神应该如何优化
sql语句如下:
select station from ( 
       select g.station  from gps_time g,card c  
       where c.id=1447647  and substr(to_char(g.tdate,'yyyy-MM-dd hh:mm:ss'),0,10)='2014-11-24' 
       and g.car_id='粤X13913' and abs(c.tdate-g.tdate)<0.003 order by abs(c.tdate-g.tdate) ) 
       where rownum=1;

------解决思路----------------------
SELECT STATION
  FROM (SELECT G.STATION
          FROM GPS_TIME G, CARD C
         WHERE C.ID = 1447647
           AND G.TDATE >= DATE '2014-11-24'
           AND G.TDATE < DATE'2014-11-24' + 1
           AND G.CAR_ID = '粤X13913'
           AND (C.TDATE < G.TDATE + 0.003 AND C.TDATE > G.TDATE - 0.003)
         ORDER BY ABS(C.TDATE - G.TDATE))
 WHERE ROWNUM = 1;
  相关解决方案