繁体   English   中英

优化 SQL 查询速度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM