J'ai une requête où je sélectionne quelques colonnes de chacune des 5 tables jointes extérieures gauche. J'ai fait un plan d'exécution dans SQL Server 2008, et il y a essentiellement des scans de table sur toutes les tables jointes, mais le coût est de 0% pour eux - je suppose qu'il n'y a pas beaucoup d'enregistrements dans ces tables les tables. Ensuite, lors des deux dernières étapes du plan d'exécution (la dernière fusion de toutes les tables et de l'instruction SELECT), 55% du coût correspond à la jointure de fusion, et 45% du coût correspond à sélectionner.Pourquoi une instruction SELECT représenterait-elle 45% du coût du plan d'exécution dans SQL Server 2008?
Cela me semble étrange ... pourquoi le coût de ces deux dernières étapes du «tout rassembler» est-il si élevé? Je pensais que tous ces scans de table ou de tri auraient des coûts plus importants.
J'essaie d'obtenir un enregistrement "résumé" de tous ces tableaux ... peut-être que je prends la mauvaise approche en quittant tout rejoindre à gauche?
mis à jour avec 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());
Pouvez-vous poster le .sqlplan (à savoir le plan d'exécution exporté pour la requête)? – chadhoc
SET SHOWPLAN_XML n'est pas pris en charge sur le serveur que je désigne (je suppose que c'est avant 2005?), Donc je ne pouvais pas obtenir un plan exporté qui me paraissait bien. – chucknelson