加快计算速率的 SQL 查询
Speeding up SQL query that compute rates
我必须计算合格率并保留总交付量,所有这些都是 SQL 中每个承运人(运输商)的。这是我为满足该需求而量身定制的查询,它成功地做到了,但是执行大约需要 5 分钟(知道 "LIVRAISON" table 有大约 350.000 个条目):
SELECT idTrans AS id,
nomTrans,
(COUNT(codeSt)
/ (SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
)
) AS Taux,
(SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
) AS Total
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans
(status_type
是在PHP中添加的IN条件。)
我怎样才能将这种查询(顺便简化一下)加速到几秒钟?
查看您的代码,您可以在连接中使用 subselect 避免列值的 select,例如:
select DISTINCT LIVRAISON.idTrans AS id
, TRANSPORTEUR.nomTrans
, t.my_rate
, t.my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
INNER JOIN (
SELECT idTrans, COUNT(codeSt)/COUNT(*) my_rate, COUNT(*) my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans ) t ON t.idTrans = LIVRAISON.idTrans
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
可能是您还可以使用另一个内部联接来避免 IN 子句
我修改了 scaisEdge 答案(及时执行但给出的速率都等于 1)以使其可用:
SELECT TOURNEE.idTrans, nomTrans, ( t.tot_typeSt/COUNT(*) ) AS Taux,
COUNT(*) AS Total
FROM LIVRAISON NATURAL JOIN TOURNEE NATURAL JOIN TRANSPORTEUR
INNER JOIN ( SELECT TOURNEE.idTrans, COUNT(codeSt) AS tot_typeSt
FROM LIVRAISON NATURAL JOIN TOURNEE
WHERE {$typeStatut} AND DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY TOURNEE.idTrans ) t ON t.idTrans = TOURNEE.idTrans WHERE DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans
谢谢,我会记得使用 INNER JOIN
的。
我必须计算合格率并保留总交付量,所有这些都是 SQL 中每个承运人(运输商)的。这是我为满足该需求而量身定制的查询,它成功地做到了,但是执行大约需要 5 分钟(知道 "LIVRAISON" table 有大约 350.000 个条目):
SELECT idTrans AS id,
nomTrans,
(COUNT(codeSt)
/ (SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
)
) AS Taux,
(SELECT COUNT(*)
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
) AS Total
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans
(status_type
是在PHP中添加的IN条件。)
我怎样才能将这种查询(顺便简化一下)加速到几秒钟?
查看您的代码,您可以在连接中使用 subselect 避免列值的 select,例如:
select DISTINCT LIVRAISON.idTrans AS id
, TRANSPORTEUR.nomTrans
, t.my_rate
, t.my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
INNER JOIN (
SELECT idTrans, COUNT(codeSt)/COUNT(*) my_rate, COUNT(*) my_count
FROM LIVRAISON
NATURAL JOIN TOURNEE
WHERE idTrans=id
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans ) t ON t.idTrans = LIVRAISON.idTrans
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
可能是您还可以使用另一个内部联接来避免 IN 子句
我修改了 scaisEdge 答案(及时执行但给出的速率都等于 1)以使其可用:
SELECT TOURNEE.idTrans, nomTrans, ( t.tot_typeSt/COUNT(*) ) AS Taux,
COUNT(*) AS Total
FROM LIVRAISON NATURAL JOIN TOURNEE NATURAL JOIN TRANSPORTEUR
INNER JOIN ( SELECT TOURNEE.idTrans, COUNT(codeSt) AS tot_typeSt
FROM LIVRAISON NATURAL JOIN TOURNEE
WHERE {$typeStatut} AND DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY TOURNEE.idTrans ) t ON t.idTrans = TOURNEE.idTrans WHERE DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans
谢谢,我会记得使用 INNER JOIN
的。