我有一个相当长的查询(10 个表,每个表大约 60k 条记录),所有这些表都使用左连接连接,因为它们可以包含空值(所有这些)。
我看到了巨大的性能损失,我将其追踪到这段代码。
SELECT *
FROM MAIN_TABLE d
LEFT JOIN INSURANCES i on i.IMREDEM_CODE = d.IMREDEM_CODE
and i.INS_TERMINATIONDATE IS NULL
and INS_RANK = 0
and i.IMREINS_CODE = (SELECT TOP 1 IMREINS_CODE
from INSURANCES i2
WHERE i2.IMREDEM_CODE = i.IMREDEM_CODE
and i2.INS_TERMINATIONDATE IS NULL
and i2.INS_RANK = 0
ORDER BY TAG_SYSTEMDATE DESC)
基本上我需要做的是保险表可能包含 0 条或多条记录,因为当他们更新保险时,它会执行插入而不是出于审计目的的更新。所以我必须加入表两次,在左连接上。此外,我需要对主要和次要保险执行两次此查询(主要是 rank = 0,次要是 rank =1。IMREDEM_CODE 是 D 表的 PK 和 i 表的 FK。
答案在这里:
left join INSURANCES i on i.IMREDEM_CODE = d.IMREDEM_CODE
and i.IMREINS_CODE = (SELECT max(imreins_code) FROM INSURANCES i2 WHERE i2.IMREDEM_CODE = i.IMREDEM_CODE and i2.INS_TERMINATIONDATE IS NULL and i2.INS_RANK = 0)