我有一个查询,有LEFT OUTER JOIN和一些嵌套查询,我怎么可以重写它(优化它的辩论,因为该变种的查询时间是太糟糕了(超过100秒):优化查询,是真的吗?
SELECT
catalog_requests_character_group_for_report.name as nameGroup,
catalog_requests_character_group.name as nameFirst,
catalog_requests_character.name as nameSecond,
catalog_requests_character_group.characterGroupCode as characterGroupCode,
catalog_requests_character.characterCode as characterCode,
(SELECT count(subscriberNumber) FROM t_emergency_requests WHERE (subscriberNumber>-1 and capacityFlag=false) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countGas,
(SELECT count(subscriberBalloonNumber) FROM t_emergency_requests WHERE (subscriberBalloonNumber>-1 or capacityFlag=true) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countBalloon,
(SELECT count(subscriberNumber) FROM t_emergency_requests WHERE (subscriberNumber>-1 and capacityFlag=false) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND detectedCode=0 AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countGasUnjustified,
(SELECT count(subscriberBalloonNumber) FROM t_emergency_requests WHERE (subscriberBalloonNumber>-1 or capacityFlag=true) AND t_emergency_requests.characterCode=catalog_requests_character.characterCode AND catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode AND detectedCode=0 AND startDate >= '2015-11-01' AND startDate <= '2016-11-30') AS countBalloonUnjustified
FROM catalog_requests_character_group_for_report, catalog_requests_character LEFT OUTER JOIN catalog_requests_character_group ON catalog_requests_character.characterGroupCode= catalog_requests_character_group.characterGroupCode
LEFT OUTER JOIN t_emergency_requests ON catalog_requests_character.characterCode= t_emergency_requests.characterCode WHERE catalog_requests_character.characterGroupForReportCode= catalog_requests_character_group_for_report.characterGroupForReportCode GROUP BY nameSecond
任何我试图删除在左加入子查询,但我有一个错误的地方,最后它没有正确地考虑金额
我重建不起作用:
#catalog_requests_character as a
#catalog_requests_character_group_for_report as b
#catalog_requests_character_group as c
#t_emergency_requests as d
SELECT
b.NAME AS nameGroup,
c.NAME AS nameFirst,
a.NAME AS nameSecond,
c.characterGroupCode AS characterGroupCode,
a.characterCode AS characterCode, Gas.countGas, Ballon.countBalloon, CGas.countGasUnjustified, CBalloon.countBallonUnjustified
FROM
catalog_requests_character as a
INNER JOIN catalog_requests_character_group_for_report as b ON a.characterGroupForReportCode = b.characterGroupForReportCode
LEFT OUTER JOIN catalog_requests_character_group as c ON a.characterGroupCode = c.characterGroupCode
LEFT OUTER JOIN t_emergency_requests as d ON a.characterCode = d.characterCode
LEFT JOIN (SELECT
count(subscriberNumber) as countGas
FROM
t_emergency_requests
WHERE
(
subscriberNumber >- 1
AND capacityFlag = FALSE
)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') Gas ON a.characterCode = d.characterCode
LEFT JOIN (SELECT
count(subscriberBalloonNumber) as countBalloon
FROM
t_emergency_requests
WHERE
(
subscriberBalloonNumber >- 1
OR capacityFlag = TRUE
)
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') Ballon ON (a.characterCode = d.characterCode AND a.characterGroupForReportCode = b.characterGroupForReportCode)
LEFT JOIN (SELECT
count(subscriberNumber) as countGasUnjustified
FROM
t_emergency_requests
WHERE
(
subscriberNumber >- 1
AND capacityFlag = FALSE
)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CGas ON a.characterCode = d.characterCode
LEFT JOIN (SELECT
count(subscriberBalloonNumber) as countBallonUnjustified
FROM
t_emergency_requests
WHERE
(
subscriberBalloonNumber >- 1
OR capacityFlag = TRUE
)
AND detectedCode = 0
AND startDate >= '2016-11-01'
AND startDate <= '2016-11-30') CBalloon ON (a.characterCode = d.characterCode AND a.characterGroupForReportCode = b.characterGroupForReportCode)
GROUP BY
nameSecond
ORDER BY
nameGroup
EXPLAIN查询1结果: enter image description here
会很乐意的如何解决此类问题的几个例子,它是一个多LEFT JOIN的和WHERE它
您使用的是mysql还是sql server?如果是sql server,那么如果你可以把你的执行计划放在www.pastetheplan.com上给我们的链接,它会有很大的帮助。 –
使用MySQL 5.6 –
首先要弄清楚哪些RDBMS你使用。然后参见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-询问 – Strawberry