2013-07-28 78 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。 。 。這兩個查詢將返回相同的結果。我認爲他們也會有相同的執行計劃。 –