使用 JOIN 表示法,您可以编写:
SELECT UNIQUE a.regnum, a.name
FROM re23mmf a
JOIN rj82std b ON a.regnum = b.regnum
JOIN gg7crs c ON a.regnum = c.regnum
JOIN rr099stdusr j ON b.dep_code = j.dep_code
AND b.study_code = j.study_code
JOIN hkcourse h ON c.crsnum = h.crsnum
JOIN aalt:mms3f x ON a.regnum = x.regnum
JOIN aalt:rhcasestudy y ON x.regserial = y.regserial
WHERE b.term_no = (SELECT MAX(d.term_no) FROM rj82std d
WHERE d.regnum = a.regnum)
AND j.start_date <= TODAY AND j.end_date >= TODAY
AND j.emp_num = 4324
AND h.is_project = 'j'
AND y.batch_no = (SELECT MAX(z.batch_no) FROM rhcasestudy z
WHERE z.regserial = y.regserial)
AND y.case_code <> 5
除非我在转录和编辑过程中搞砸了,否则这实际上与原始查询相同。我在 WHERE 子句中保留了单表过滤条件;优化器应该将它们下推到相关的表中,以尽量减少工作量。
如前所述,关键是研究 SET EXPLAIN 的输出并确保没有丢失的索引。确保统计数据是最新的也是一个好主意,也许使用 AUS(自动更新统计数据)。
这将有助于确定表的基数。在 15 秒内生成 400 行可能是可怕的性能(任何表中最多有 400 行),或者可能是出色的性能(最大的表有 40 亿行,每行 2 KiB)。如果没有尺寸信息,很难知道哪个更有可能。
a ----> b ----> j
| |
| +-----> d
|
+-----> c ----> h
|
+-----> x ----> y ----> z
该图显示了连接结构。Alias独立地a
加入b
, c
, 和x
;b
join to j
and to (a sub-query on) d
; c
加入h
; x
加入y
; 并y
加入 (a sub-query on) z
。
请注意,子查询都是相关的子查询;一般来说,这些效率较低。也许您需要使用子查询,例如:
SELECT d.regnum, MAX(d.term_no) AS max_term_no
FROM rj82std AS d
GROUP BY d.regnum
在 FROM 子句中:
SELECT UNIQUE a.regnum, a.name
FROM re23mmf a
JOIN rj82std b ON a.regnum = b.regnum
JOIN gg7crs c ON a.regnum = c.regnum
JOIN rr099stdusr j ON b.dep_code = j.dep_code
AND b.study_code = j.study_code
JOIN hkcourse h ON c.crsnum = h.crsnum
JOIN aalt:mms3f x ON a.regnum = x.regnum
JOIN aalt:rhcasestudy y ON x.regserial = y.regserial
JOIN (SELECT d.regnum, MAX(d.term_no) AS max_term_no
FROM rj82std AS d
GROUP BY d.regnum
) AS d1 ON b.regnum = d1.regnum AND b.term_no = d1.max_term_no
JOIN (SELECT z.regserial, MAX(z.batch_no) AS max_batch_no
FROM rhcasestudy z
GROUP BY z.regserial
) AS z1 ON y.regserial = z1.regserial
AND y.batch_no = z1.max_batch_no
WHERE j.start_date <= TODAY AND j.end_date >= TODAY
AND j.emp_num = 4324
AND h.is_project = 'j'
AND y.case_code <> 5
这些子查询只需要评估一次,而不是像相关子查询中的每一行。这不是一个保证的胜利,但它通常有很大帮助。