我在查询下方更新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
我的问题是:
第二个查询是否与第一个查询一样执行?
第二个查询是否会胜过第一个查询?
*注意:我有大量数据,我们在执行时遇到硬件问题 这些问题。
我已经在SO发布了这里,以便我可以看到任何我能看到的意见。
答案 0 :(得分:0)
您的第一个查询将不会执行,因为它缺少on
子句。我假设on
子句真的是a.Id = b.Id
。
您要问的问题是如何优化查询。回答的真正方法是查看查询计划,您可以在SQL Server Management Studio中轻松查看该计划。您可以从documentation开始沿着这条路走下去。
但是,在您的情况下,您使用子查询来说“在读取数据时执行过滤”。实际上,SQL Server通常将这种过滤操作推送到表读取,因此子查询可能是多余的。
如果您想提高效果,我建议您在表格中使用以下索引:hierarchical(parentname, id)
和hierarchical(name, id)
。这些应该可以带来良好的性能提升。