2016-11-08 227 views
0

我有查询运行速度很慢。查询的目标是从表格artikli中列出来自表格和数量的所有文章。然后我想看看它们在另一表中列出的商品销售(artikli_2016今年,和artikli_2015为前一年)查询运行速度很慢

SELECT a.artid, 
    a.artsifra, 
    a.artnaziv, 
    a.artstanje, 
    a.artstanjepalete, 
    (a.artstanje + a.artstanjepalete) AS total, 
    Sum(g.izlaz)      AS promet, 
    c.jmoznaka, 
    Sum(f.izlaz)      AS promet 
FROM artikli a 
     LEFT JOIN artikli_2016 g 
       ON a.artid = g.artikal 
     LEFT JOIN artikli_2015 f 
       ON a.artid = f.artikal 
     LEFT JOIN jed_mjere c 
       ON a.artmjera = c.jmid 
WHERE a.artroditelj != 0 
     AND a.artaktivan 
GROUP BY a.artid 
ORDER BY a.artid ASC 

有一次,我参加artikli_2015它会非常缓慢。如果有人能够给我一个建议或解决方案来更快地运行查询将会非常有帮助。

+1

你有没有索引的表?你能分享这个模式吗? –

+0

删除GROUP BY子句 –

+0

只需更改左连接即可简单连接 –

回答

1

由于2批次的多个记录(我怀疑),那么你可能需要使用几个子查询来获得总和。假设jed_mjere对每个ArtMjera最多只有1条记录。

SELECT a.ArtId, 
     a.ArtSifra, 
     a.ArtNaziv, 
     a.ArtStanje, 
     a.ArtStanjePalete, 
     (a.ArtStanje + a.ArtStanjePalete) as total, 
     g.promet, 
     c.JmOznaka, 
     f.promet 
FROM artikli a 
LEFT OUTER JOIN 
(
    SELECT Artikal, SUM(Izlaz) AS promet 
    FROM artikli_2016 
    GROUP BY Artikal 
) g 
ON a.ArtId = g.Artikal 
LEFT OUTER JOIN 
(
    SELECT Artikal, SUM(Izlaz) AS promet 
    FROM artikli_2015 
    GROUP BY Artikal 
) f 
ON a.ArtId = f.Artikal 
LEFT OUTER JOIN jed_mjere c ON a.ArtMjera = c.jmid 
WHERE a.ArtRoditelj != 0 
AND a.ArtAktivan 
ORDER BY a.ArtId ASC 

如果您的查询只与少数从artikli记录(即a.ArtRoditelj!= 0 AND a.ArtAktivan排除大多数行),那么也许值得做处理联接排除在记录子查询。

SELECT a.ArtId, 
     a.ArtSifra, 
     a.ArtNaziv, 
     a.ArtStanje, 
     a.ArtStanjePalete, 
     (a.ArtStanje + a.ArtStanjePalete) as total, 
     g.promet, 
     c.JmOznaka, 
     f.promet 
FROM artikli a 
LEFT OUTER JOIN 
(
    SELECT g.Artikal, SUM(g.Izlaz) AS promet 
    FROM artikli a 
    INNER JOIN artikli_2016 g 
    ON a.ArtId = g.Artikal 
    WHERE a.ArtRoditelj != 0 
    AND a.ArtAktivan 
    GROUP BY g.Artikal 
) g 
ON a.ArtId = g.Artikal 
LEFT OUTER JOIN 
(
    SELECT f.Artikal, SUM(f.Izlaz) AS promet 
    FROM artikli a 
    INNER JOIN artikli_2015 f 
    ON a.ArtId = g.Artikal 
    WHERE a.ArtRoditelj != 0 
    AND a.ArtAktivan 
    GROUP BY f.Artikal 
) f 
ON a.ArtId = f.Artikal 
LEFT OUTER JOIN jed_mjere c ON a.ArtMjera = c.jmid 
WHERE a.ArtRoditelj != 0 
AND a.ArtAktivan 
ORDER BY a.ArtId ASC 
+0

这正是我所需要的非常感谢 – user3651819