SQL优化

qsc1818518 2019-09-05 03:42:28
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秒
...全文
358 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhdz_bj 2019-09-25
  • 打赏
  • 举报
回复
没执行计划,没数据环境,在这里讨论SQL优化,没有依据,因此,也没多大意义。
riven2011 2019-09-19
  • 打赏
  • 举报
回复
引用 10 楼 qsc1818518 的回复:
[quote=引用 8 楼 晴风锐雯 的回复:]
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表,反过来也可以,试试吧



不是等于,应该大于等于,就好慢[/quote]

我这边写错了 你换成>= 你给一下表数据量和结果集
qsc1818518 2019-09-17
  • 打赏
  • 举报
回复
引用 8 楼 晴风锐雯 的回复:
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表,反过来也可以,试试吧



不是等于,应该大于等于,就好慢
wilson1966 2019-09-17
  • 打赏
  • 举报
回复
如果是winForm 可以先用SQL抓3天数据,细节用前台过滤条件来过滤。 这样速度会快一点
riven2011 2019-09-16
  • 打赏
  • 举报
回复
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表,反过来也可以,试试吧
qsc1818518 2019-09-09
  • 打赏
  • 举报
回复
引用 6 楼 Rotel-刘志东 的回复:
贴一下执行计划吧,查询条件是用不到索引的。


查询计划 走的是全表扫描
Rotel-刘志东 2019-09-08
  • 打赏
  • 举报
回复
贴一下执行计划吧,查询条件是用不到索引的。
qsc1818518 2019-09-06
  • 打赏
  • 举报
回复
引用 4 楼 AHUA1001 的回复:
在不改变现有的表结果基础上,这个语句很难优化。怎么会有这么烧脑的设计啊。至少,要把年月日和时分秒放到一个字段里啊。


我太难了
AHUA1001 2019-09-06
  • 打赏
  • 举报
回复
在不改变现有的表结果基础上,这个语句很难优化。怎么会有这么烧脑的设计啊。至少,要把年月日和时分秒放到一个字段里啊。
stelf 2019-09-05
  • 打赏
  • 举报
回复
看到这个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要往这个思路上靠。
qsc1818518 2019-09-05
  • 打赏
  • 举报
回复
引用 1 楼 minsic78 的回复:
这么复杂的过滤表达式,怎么能走到普通索引,要么修改条件,要么创建那么复杂的函数索引,前提还需要符合这个条件的数据量比较少。


条件怎么修改好点
minsic78 2019-09-05
  • 打赏
  • 举报
回复
这么复杂的过滤表达式,怎么能走到普通索引,要么修改条件,要么创建那么复杂的函数索引,前提还需要符合这个条件的数据量比较少。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧