【问题标题】:SQL Server inner join and subquerySQL Server 内部联接和子查询
【发布时间】:2013-07-28 03:32:00
【问题描述】:

我在下面的查询中更新了HierarchicalTable 上的某些 ID。

我的第一个查询是稳定的,但我的性能有问题:

DECLARE @targetName varchar(100)
UPDATE a
SET   a.PrimaryId = b.PrimaryId
    , a.SecondaryId = b.SecondaryId
FROM
(
    SELECT PrimaryId
         , SecondaryId
    FROM Hierarchical
    WHERE ParentName = @targetName
) as a
JOIN 
(
    SELECT PrimaryId
         , SecondaryId
    FROM Hierarchical
    WHERE Name = @targetName
) b
ON a.ParentId = b.Id

下一个查询是我的第二个选项:

DECLARE @targetName varchar(100)

UPDATE a
SET   a.PrimaryId = b.PrimaryId
    , a.SecondaryId = b.SecondaryId
FROM Hierarchical a
JOIN Hierarchical b
ON a.ParentId = b.Id
WHERE a.ParentName = @targetName
  AND b.Name = @targetName

我的问题是:

  1. 第二个查询是否像第一个查询一样执行?

  2. 第二个查询会优于第一个查询吗?

*注意:我有大量数据,我们在执行时遇到了硬件问题 这些查询。

我已经在 SO 发帖,这样我可以有任何我能看到的意见。

【问题讨论】:

    标签: sql sql-server subquery query-optimization inner-join


    【解决方案1】:

    您的第一个查询将不会执行,因为它缺少on 子句。让我假设on 子句实际上是a.Id = b.Id

    您要问的问题是如何优化查询。真正的回答方法是查看查询计划,您可以在 SQL Server Management Studio 中轻松查看。你可以从documentation 开始走这条路。

    但是,在您的情况下,您使用子查询来表示“在读取数据时进行过滤”。实际上,SQL Server 通常会将此类过滤操作下推到表读取,因此子查询可能是多余的。

    如果你想提高性能,我建议你在表上有以下索引:hierarchical(parentname, id)hierarchical(name, id)。这些应该可以很好地提升性能。

    【讨论】:

    • 谢谢。无论如何,我可以知道,如果这两个查询将有相同的结果? hierarchical(parentname, id)hierarchical(name, id)id 列上的重复索引吗?
    • @Shermay 。 . .这两个查询将返回相同的结果。我认为他们也会有相同的执行计划。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多