当前位置: 首页 > 面试题库 >

SQL子查询还是INNER-JOIN?

曾飞雨
2023-03-14
问题内容

我有以下两个查询:

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
…等在。

通过加入作品 集中
在第一两个表的结果的操作,任何后续的联接将集中于内存中的接合(或缓存到磁盘)所述第一连接表的结果,等等。较少的读写针移动,因此速度更快



 类似资料:
  • 问题内容: 我有两个包含“任务”和“注释”的表,并且想要检索一个任务列表,以及每个任务的关联注释数。这两个查询可以完成任务: 它们之间有区别吗?我应该在一个之上使用另一个,还是它们只是完成同一工作的两种方式?谢谢。 问题答案: 在小型数据集上,当涉及到性能时,它们会被淘汰。索引时,LOJ会好一些。 我发现在大型数据集上,内部联接(内部联接也将起作用。)将在很大的因素(抱歉,没有数字)方面优于子查询

  • 问题内容: 我想知道使用INNER JOIN -clause的SQL查询的django等效项。我有两个与ForeignKey链接的模型。 我想从“表”中将“ item_is_locked”值设置为false的请求表中获取字段 如果使用SQL查询,我将使用以下代码: 问题答案: 您可以使用和获得所需的结果。 尝试:

  • 主要内容:1.带有Select语句的子查询,2.带有INSERT语句的子查询,3.带有UPDATE语句的子查询,4.带有DELETE语句的子查询子查询是另一个SQL查询中的查询,并嵌入在子句中。 重要规则: 子查询可以放在许多SQL子句中,如子句,子句,子句。 可以将子查询与,,,语句以及,,, ,,,等运算符一起使用。 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。 子查询位于比较运算符的右侧。 子查询括在括号中。 在子查询中,不能使用命令。 但命令可用于执行与命令相同的

  • 主要内容:语法,示例子查询也称“内部查询”或者“嵌套查询”,是指将一个 SELECT 查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。 子查询可以嵌入 SELECT、INSERT、UPDATE 和 DELETE 语句中,也可以和 =、<、>、IN、BETWEEN、EXISTS 等运算符一起使用。 子查询常用在 WHERE 子句和 FROM 子句后边: 当用于 WHERE 子句时,根据不同

  • SQL 子查询 子查询是一个SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或UPDATE 语句或嵌套在另一子查询中。 语法 可用三种语法来创建子查询: comparison [ANY | ALL | SOME] (sqlstatement) expression [NOT] IN (sqlstatement)

  • 主要内容:带有 SELECT 语句的子查询,带有 INSERT 语句的子查询,带有 UPDATE 语句的子查询,带有 DELETE 语句的子查询子查询与其他 SQL Server 查询一起使用并嵌入 WHERE 子句。子查询用于返回数据,在主问题中用作限制要检索的数据的条件。 子查询与语句 SELECT、INSERT、UPDATE 和 DELETE 一起使用,并带有运算符 、、、、、 和 等。 子查询遵循的规则很少 - 子查询括在括号中。 子查询包括 FROM 子句和 SELECT 子句。 子查