У меня есть запрос, в котором я выбираю несколько столбцов из каждой из 5 левых внешних соединенных таблиц.
Я составил план выполнения в SQL Server 2008, и в основном сканирование таблиц выполняется для всех объединенных таблиц, но для них стоимость составляет 0% - я предполагаю, потому что в этих таблицах не так много записей.
Затем на последних 2 шагах плана выполнения (последнее объединение слиянием всех таблиц и фактический оператор 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());