select count(*)
 FROM flight_info f
 INNER JOIN spa_plan p
 ON f.dest_code=p.depAirportCode 
 WHERE f.area_type='D'
 and (to_date(p.timeseries||' '||p.Deptime,'YYYY/MM/DD HH24mi')- (case when f.arrival_time < f.takeoff_time then to_date(f.flight_date||' '||substr(f.arrival_time,1,2)||':'||substr(f.arrival_time,3,2)||':00','yyyy-MM-dd HH24:mi:ss')+1 else to_date(f.flight_date||' '||substr(f.arrival_time,1,2)||':'||substr(f.arrival_time,3,2)||':00','yyyy-MM-dd HH24:mi:ss')end ) )* 24>=3;
加上最后时间大于3天 就不走索引两个表都走全表扫描 查询18秒

解决方案 »

  1.   

    看到这个sql第一时间想到的就是 把 If you dont leave me. I will by your side until the life end 翻译成"你不离开我,我就跟你同归于尽"。查个3天的数据,条件搞那么复杂?
    select count(*)
      FROM flight_info f
     INNER JOIN spa_plan p
        ON f.dest_code = p.depAirportCode
     WHERE f.area_type = 'D'
       and p.timeseries >= to_char(sysdate-3, 'yyyy/mm/dd')
       and p.timeseries < to_char(sysdate+1, 'yyyy/mm/dd')
    不一定符合你的要求,但是你sql要往这个思路上靠。
      

  2.   

    CREATE INDEX idx_n1 ON  spa_plan(to_date(p.timeseries || ' ' || p.Deptime, 'YYYY/MM/DD HH24mi')) ;     
    SELECT/*+use_concat*/ COUNT(*) 
    FROM   flight_info f
    INNER  JOIN spa_plan p
    ON     f.dest_code = p.depAirportCode
    WHERE  f.area_type = 'D'
           AND ((f.arrival_time < f.takeoff_time AND
           to_date(p.timeseries || ' ' || p.Deptime, 'YYYY/MM/DD HH24mi') =
           to_date(f.flight_date || ' ' || substr(f.arrival_time, 1, 2) || ':' ||
                        substr(f.arrival_time, 3, 2) || ':00',
                        'yyyy-MM-dd HH24:mi:ss') + 1 + 3 / 24) OR
           (f.arrival_time >= f.takeoff_time AND
           to_date(p.timeseries || ' ' || p.Deptime, 'YYYY/MM/DD HH24mi') =
           to_date(f.flight_date || ' ' || substr(f.arrival_time, 1, 2) || ':' ||
                         substr(f.arrival_time, 3, 2) || ':00',
                         'yyyy-MM-dd HH24:mi:ss') + 3 / 24));
    没看具体数据量,如果你想走索引 猜想F表很小,走全表,再驱动P表,反过来也可以,试试吧
      

  3.   

    如果是winForm 可以先用SQL抓3天数据,细节用前台过滤条件来过滤。
    这样速度会快一点
      

  4.   

    没执行计划,没数据环境,在这里讨论SQL优化,没有依据,因此,也没多大意义。