0
此查询已经生效,但我收到了“超出资源限制”的报告,这让我很害怕。提取历史记录效率更高的查询
我有三个表:mainTable,sideTable和leftJoin。
mainTable关联于两个员工编号,因为它们可以单独使用或以两个一对工作。
sideTable具有员工姓名。
LeftJoin有员工活动,这是在那里我得到的最新状态的活动一大桌。
我不知道这是否是一个好的查询或没有,但它调用sideTable两次调用LeftJoin两次。
此查询结果是12秒。
WITH cteTbl AS (
SELECT
EmployeeID
,MAX(TIMESTAMP(StampDate, StampTime)) AS cteMaxTime
FROM
/**/ getMaxDateTime
GROUP BY EmployeeID
)
SELECT
/* stuff */
,sideTable1.EmployeeName1
,sideTable2.EmployeeName2
,leftJoinA.EmployeeStatus
,leftJoinB.EmployeeStatus
FROM
/**/ mainTable
LEFT JOIN /**/ sideTable1
ON mainTable.employeeNumber = sideTable1.employeeNumber
LEFT JOIN /**/ sideTable2
ON mainTable.employeeNumber = sideTable2.employeeNumber
/*tons of left joins*/
LEFT JOIN
(
SELECT leftJoinA.EmployeeNumber, leftJoinA.EmployeeStatus
FROM /**/ leftJoinA
INNER JOIN cteTbl
ON leftjoinA.EmployeeNumber = cteTbl.EmployeeNumber
AND TIMESTAMP(leftjoinA.StampDate,leftjoinA.StampTime) = cteTbl.cteMaxTime
) innerStampData1
ON sideTable1.EmployeeNumber1 = innerStampData1.EmployeeNumber
LEFT JOIN
(
SELECT leftJoinB.EmployeeNumber, leftJoinB.EmployeeStatus
FROM /**/ leftJoinB
INNER JOIN cteTbl
ON leftjoinB.EmployeeNumber = cteTbl.EmployeeNumber
AND TIMESTAMP(leftjoinB.StampDate,leftjoinB.StampTime) = cteTbl.cteMaxTime
) innerStampData2
ON sideTable2.EmployeeNumber2 = innerStampData2.EmployeeNumber
WHERE
/**/
GROUP BY
/**/
ORDER BY
/**/
如果我这样做,查询是七秒钟,但结果是每个团队重复。
LEFT JOIN
(
SELECT leftJoinA.EmployeeNumber, leftJoinA.EmployeeStatus
FROM /**/ leftJoinA
INNER JOIN cteTbl
ON leftjoinA.EmployeeNumber = cteTbl.EmployeeNumber
AND TIMESTAMP(leftjoinA.StampDate,leftjoinA.StampTime) = cteTbl.cteMaxTime
) innerStampData1
ON sideTable.EmployeeNumber1 = innerStampData1.EmployeeNumber OR sideTable2.EmployeeNumber = innerStampData2.EmployeeNumber
你对此表什么指标? –
很难找到更好的查询,如果你只写了一部分的sql,不要写表的定义和不写示例数据... –