SQL子查询还是INNER-JOIN?

Hem*_*ank 5 sql sql-server performance

我有以下两个问题:

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
Run Code Online (Sandbox Code Playgroud)

查询执行计划统计信息:(相对于批处理的查询成本)

  • 查询#1(子查询):56%
  • 查询#2(加入):44%

我thot子查询将是最佳的,因为子查询将在应用WHERE过滤器后执行.统计数据表明查询#2 - JOIN方法更好.

请建议.同样作为一个温和的SQL-Server用户,我如何能够更好地推导出哪个查询(除了执行计划之外的任何其他内容,如果它更有用)

谢谢.

Mic*_*uen 12

join比子查询更快.

子查询使繁忙的磁盘访问,想到硬盘的读写指针(head?),它在访问时来回传递:User,SearchExpression,PageSize,DrilldownPageSize,User,SearchExpression,PageSize,DrilldownPageSize,User ...等等上.

join通过将操作集中在前两个表的结果上,任何后续连接都会集中连接到第一个连接表的内存(或缓存到磁盘)结果,依此类推.较少的读写针运动,因此更快