[英]Optimizing SQL Query speed
我正在尝试优化下面的 SQL 查询,因为我使用的是一个非常古老的 RDMS,称为 firebird。 我尝试重新排列 where 子句中的项目并删除 order by 语句,但查询似乎仍然需要永远运行。 不幸的是,firebird 不支持解释执行计划功能,因此我无法识别阻止查询的代码。
select T.veh_reg_no,T.CON_NO, sum(T.pos_gpsunlock) as SUM_GPS_UNLOCK,
count(T.pos_gpsunlock) as SUM_REPORTS, contract.con_name
from
(
select veh_reg_no,CON_NO,
case when pos_gpsunlock = upper('T') then 1 else 0 end as pos_gpsunlock
from vehpos
where veh_reg_no in
( select regno
from fleetvehicle
where fleetno in (97)
) --DS5
and pos_timestamp > '2022-07-01'
and pos_timestamp < '2022-08-01'
) T
join contract on T.con_no = contract.con_no
group by T.veh_reg_no, T.con_no,contract.con_name
order by SUM_GPS_UNLOCK desc;
如果有人可以提供帮助,将不胜感激。
我要么注释掉一些子查询,要么删除一个连接或聚合,看看是否能改进它。 一旦你发现有问题的代码,也许你可以移动它或重新编写它。 我对 Firebird 一无所知,但我会使用以下代码处理该查询,将聚合包装在连接之外并删除“Where in”子句。
如果没有任何效果,您可以创建一个聚合表或预过滤表并使用它吗?
select
x.*
,sum(case when x.pos_gpsunlock = upper('T') then 1 else 0 end) as SUM_GPS_UNLOCK
,count(*) as SUM_REPORTS
FROM (
select
a.veh_reg_no
,a.pos_gpsunlock
,a.CON_NO
,c.con_name
FROM vehpos a
JOIN fleetvehicle b on a.veg_reg_no = b.reg_no and b.fleetno = 97 and b.pos_timestamp between '222-07-01' and '2022-08-01'
JOIN contract c on a.con_no = contract.con_no
) x
Group By....
这可能有助于将子查询转换为连接并减少嵌套。 还有一个=
而不是IN()
操作。
select vp.veh_reg_no,vp.con_no,c.con_name,
count(*) as SUM_REPORTS,
sum(case when pos_gpsunlock = upper('T') then 1 else 0 end) as SUM_GPS_UNLOCK
from vehpos vp
inner join fleetvehicle fv on fv.fleetno = 97 and fv.regno = vp.veh_reg_no
inner join contract c on vp.con_no = c.con_no
where vp.pos_timestamp >= '2022-07-01'
and vp.pos_timestamp < '2022-08-01'
group by vp.veh_reg_no, vp.con_no, c.con_name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.