我有一个查询,我从 5 个左外连接表中的每一个中选择几列。
我在 SQL Server 2008 中做了一个执行计划,基本上对所有连接的表都进行了表扫描,但它们的成本都是 0%——我假设是因为这些表中的记录不多。
然后在执行计划的最后两步(所有表的最终合并连接和实际的 SELECT 语句),它说 55% 的成本是合并连接,45% 的成本是选择。
这对我来说似乎很奇怪......为什么最后 2 个“将所有内容整合在一起”步骤的成本如此之高?我认为所有这些表扫描或排序步骤都会产生更大的成本。
我正在尝试从所有这些表中获取一个“汇总”记录......也许我在左加入所有内容时采取了错误的方法?
用 SQL 更新
SELECT
/* Names */
NM.EMPLID, NM.NAME_PREFIX, NM.LAST_NAME, NM.FIRST_NAME, NM.MIDDLE_NAME, NM.NAME_SUFFIX,
/* Directory Info */
DIR_PERSON.BIRTH_DT,
/* PERSDATA */
PERS.SEX, PERS.HIGHEST_EDUC_LVL,
/* DIVERS.ETHNIC */
ETHNIC.ETHNIC_GRP_CD,
/* TENURE */
TENURE.EMPLID, TENURE.TENURE_STATUS, TENURE.EG_GRANTED_DT, TENURE.EG_TENURE_HOME,
TENURE.EG_TRACK_HIRE_DT, TENURE.EG_MAND_REVW_DT, TENURE.CODE,
/* VISA */
VISA.VISA_PERMIT_TYPE
FROM NAMES NM
/* ----- Table Joins ----- */
/* Directory Join */
LEFT OUTER JOIN DIR_PERSON ON DIR_PERSON.ID = NM.EMPLID
/* PERS_DATA Join */
LEFT OUTER JOIN PERS ON PERS.EMPLID = NM.EMPLID
AND PERS.EFFDT =( SELECT MAX(PERS_CURRENT.EFFDT) FROM PERS_CURRENT
WHERE PERS.EMPLID = PERS_CURRENT.EMPLID
AND PERS_CURRENT.EFFDT <= GETDATE())
/* ETHNIC Join */
LEFT OUTER JOIN ETHNIC ON ETHNIC.EMPLID = NM.EMPLID
AND ETHNIC.PRIMARY_INDICATOR = 'Y'
/* TENURE Join */
LEFT OUTER JOIN TENURE ON TENURE.EMPLID = NM.EMPLID
/* VISA Join */
LEFT OUTER JOIN VISA ON VISA.EMPLID = NM.EMPLID
AND VISA.EFFDT = ( SELECT MAX(VISA_CURRENT.EFFDT) FROM VISA_CURRENT
WHERE VISA.EMPLID = VISA_CURRENT.EMPLID
AND VISA_CURRENT.EFFDT <= GETDATE())
/* ----- End Table Joins ----- */
WHERE NM.NAME_TYPE = 'PRI'
AND NM.EFFDT = (SELECT MAX(NM_CURRENT.EFFDT) FROM NM_CURRENT
WHERE NM.EMPLID = NM_CURRENT.EMPLID
AND NM.NAME_TYPE = NM_CURRENT.NAME_TYPE
AND NM_CURRENT.EFFDT <= GETDATE());