2013-07-28 97 views
3

我有下面的查询更新HierarchicalTable上的某些ID。SQL Server内部连接和子查询

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

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这里发布过,以便我可以看到任何意见。

回答

0

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

您问的问题是关于如何优化查询。真正的答案是查看SQL Server Management Studio中的查询计划。您可以从documentation开始走这条路。

就你而言,你正在使用子查询来说“当你读取数据时进行过滤”。实际上,SQL Server通常会将这种过滤操作推到表读,所以子查询可能是多余的。

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

+0

谢谢你。无论如何,我可否知道,如果这两个查询会有相同的结果? “层级(父名,ID)”和“层级(名称,ID)”是否是'id'列的重复索引? – Shermay

+0

@Shermay。 。 。这两个查询将返回相同的结果。我认为他们也会有相同的执行计划。 –