【问题标题】:Query runs very slow查询运行很慢
【发布时间】:2016-11-08 10:35:40
【问题描述】:

我的查询运行速度很慢。查询的目标是列出表格中的所有文章和表格 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,它就会变得非常缓慢。如果有人可以给我建议或解决方案以更快地运行查询,那将非常有帮助。

【问题讨论】:

  • 你的表有索引吗?可以分享一下架构吗?
  • 删除 GROUP BY 子句
  • 只需将左连接更改为简单连接
  • @Jai 他可能需要来自artikli 的所有记录,这些记录可能不存在于其他表中,例如artikli_2015,我希望不会有2016 年的记录。
  • 您实际上是在为 ArtId 的每个值在 artikli_2016 和 artikli_2015 之间进行交叉连接。即,如果每个表上有 100 行对应 ArtId 的特定值,那么就是 10000 种组合。

标签: mysql


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 2014-01-21
    • 1970-01-01
    • 2013-11-27
    • 2017-03-17
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多