SQL 子查询还是 INNER-JOIN?

2023-11-26

我有以下两个疑问:

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

查询执行计划统计:(相对于批次的查询成本)

  • 查询#1(子查询):56%
  • 查询#2(连接):44%

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

请建议。另外,作为一个中等的 SQL-Server 用户,我怎样才能得出哪个查询更好(除了执行计划之外的任何查询,如果它更有帮助的话)

谢谢。


连接比子查询更快。

子查询导致繁忙的磁盘访问,想想硬盘的读写针(头?)当它访问时会来回:User、SearchExpression、PageSize、DrilldownPageSize、User、SearchExpression、PageSize、DrilldownPageSize、User...等等。

加入作品集中精力对前两个表结果的操作,任何后续连接都将集中连接第一个连接表的内存中(或缓存到磁盘)结果,依此类推。读写针移动更少,因此速度更快

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 子查询还是 INNER-JOIN? 的相关文章

随机推荐