5 つの左外部結合テーブルのそれぞれからいくつかの列を選択するクエリがあります。
私は SQL Server 2008 で実行計画を立てました。基本的に、結合されたすべてのテーブルでテーブル スキャンが行われますが、それらのコストはすべて 0% です。これらのテーブルには多くのレコードがないためだと思います。
次に、実行計画の最後の 2 ステップ (すべてのテーブルの最終マージ結合と実際の SELECT ステートメント) で、コストの 55% がマージ結合であり、コストの 45% が選択であると述べています。
これは私には奇妙に思えます...最後の2つの「すべてをまとめる」ステップのコストがなぜそれほど高いのですか? これらすべてのテーブル スキャンまたは並べ替えの手順には、より大きなコストがかかると思いました。
これらすべてのテーブルから「要約された」レコードを 1 つ取得しようとしています。
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());