SQL Server内连接和子查询

3
我下面有一个更新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. 第二个查询是否比第一个查询更快?

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

我在这里发帖是为了听取任何意见。

1个回答

0

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

你所问的问题与查询优化有关。真正回答这个问题的方法是查看查询计划,你可以在SQL Server Management Studio中轻松地看到它。你可以从文档开始进入这条路。

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

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


谢谢你。无论如何,我想知道这两个查询是否会产生相同的结果?hierarchical(parentname, id)hierarchical(name, id)是否是id列上的重复索引? - Shermay
@Shermay . . . 两个查询将返回相同的结果。我认为它们也会有相同的执行计划。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接