SQL优化求助:查询拥有全部车辆类别的汽车租赁门店
全类别车辆覆盖门店SQL查询优化方案
你原有SQL的逻辑是正确的,主要冗余点在于不必要的AGENCE表关联:你的查询目标仅返回门店编号CODE_AG,而VEHICULE表本身就携带CODE_AG字段,只要业务上保证VEHICULE的CODE_AG都是AGENCE中存在的合法值,这一步JOIN完全可以省去,减少关联开销。
优化版本1(最简通用版)
直接去掉冗余的AGENCE表关联,写法简洁性能提升明显:
SELECT V.CODE_AG FROM VEHICULE V GROUP BY V.CODE_AG HAVING COUNT(DISTINCT V.CODE_CATEG) = (SELECT COUNT(*) FROM CATEGORIE);
如果业务要求返回的CODE_AG必须是AGENCE表中存在的合法门店,可增加EXISTS校验,性能优于原写法的INNER JOIN:
SELECT V.CODE_AG FROM VEHICULE V WHERE EXISTS ( SELECT 1 FROM AGENCE A WHERE A.CODE_AG = V.CODE_AG ) GROUP BY V.CODE_AG HAVING COUNT(DISTINCT V.CODE_CATEG) = (SELECT COUNT(*) FROM CATEGORIE);
优化版本2(大数据量高性能版)
如果VEHICULE表数据量极大,COUNT(DISTINCT)出现明显性能瓶颈,可以用双NOT EXISTS的集合运算逻辑实现,适合车辆类别总数不多的场景:
SELECT DISTINCT V.CODE_AG FROM VEHICULE V WHERE NOT EXISTS ( -- 遍历所有车辆类别 SELECT C.CODE_CATEG FROM CATEGORIE C -- 校验不存在当前门店未覆盖的类别 WHERE NOT EXISTS ( SELECT 1 FROM VEHICULE V2 WHERE V2.CODE_AG = V.CODE_AG AND V2.CODE_CATEG = C.CODE_CATEG ) );
内容的提问来源于stack exchange,提问作者guillaumearnx
相关产品推荐
相关产品推荐

