SQL Sous-requête ou à l'INTÉRIEUR de la REJOINDRE?

J'ai les deux requêtes suivantes:

declare @UserId as int
set @UserId = 1

-- Query #1: Sub-query
SELECT
    u.[Id] ,
    u.[Name] ,
    u.[OrgId] AS Organization,
    (SELECT o.[Name] FROM Org o WHERE o.Id = u.OrgId) As OrganizationName,
    [UserRoleId] AS UserRole,
    [UserCode] AS UserCode,
    [EmailAddress] As EmailAddress, 
    (SELECT SearchExpression FROM SearchCriteria WHERE UserId = @UserId AND IsDefault=1 ) AS SearchCriteria,
    (SELECT PageSize FROM UserPreferences WHERE UserId = @UserId) AS UserPreferencePageSize,
    (SELECT DrilldownPageSize FROM UserPreferences WHERE UserId = @UserId) AS UserPreferenceDrilldownPageSize
    FROM [User] as u
WHERE u.Id = @UserId

-- Query #2: LEFT OUTER JOIN-query
SELECT
    u.[Id] ,
    u.[Name] ,
    u.[OrgId] AS Organization,
    (SELECT o.[Name] FROM Org o WHERE o.Id = u.OrgId) As OrganizationName,
    [UserRoleId] AS UserRole,
    [UserCode] AS UserCode,
    [EmailAddress] As EmailAddress, 
    sc.SearchExpression As SearchExpression,
    up.PageSize As PageSize,
    up.DrilldownPageSize As DrilldownPageSize    
    FROM [User] as u
LEFT OUTER JOIN [UserPreferences] as up ON u.id = up.UserId
LEFT OUTER JOIN [SearchCriteria] as sc ON u.id = sc.UserId
    WHERE ISNULL(sc.IsDefault,1)=1 AND u.Id = @UserId

Plan d'exécution de requête statistiques: (coût d'une Requête relative à lot)

  • Requête#1 (Sous-Requête) : 56%
  • Requête no 2 (JOIN) : 44%

Je thot la sous-requête serait optimale en raison de la sous-requête sera exécutée après la OÙ le filtre est appliqué. Les statistiques disent que la Requête n ° 2 - REJOINDRE approche est la meilleure.

Pls suggèrent. Aussi comme un modéré SQL-Server de l'utilisateur comment puis-je déterminer la requête est mieux (ou quelque chose d'autre, alors l'exécution du plan, si elle est plus utile)

Merci.

-- Requête n ° 3: Compléter la JOINTURE EXTERNE GAUCHE-requête SELECT u.[Id] , u.[Nom] , u.[OrgId] en tant QU'Organisation, l'u.OrgId Comme OrgId, o.[Name] OrganizationName, u.[UserRoleId] COMME UserRole, u.[Code d'utilisateur] COMME code d'utilisateur, u.[E-mail] Comme EmailAddress, sc.SearchExpression Comme SearchExpression, jusqu'.PageSize Comme PageSize, jusqu'.DrilldownPageSize Comme DrilldownPageSize DE [Utilisateur] comme u JOINTURE EXTERNE GAUCHE [UserPreferences] SUR u.id=.UserId JOINTURE EXTERNE GAUCHE [SearchCriteria] sc SUR u.id = sc.UserId JOINTURE EXTERNE GAUCHE [Org] o SUR o.Id = u.OrgId OÙ ISNULL(sc.IsDefault,1)=1 ET u.Id = @UserId

OriginalL'auteur Hemant Tank | 2009-11-24