从表变量和原始表中选择之间的性能差异

时间:2018-01-29 10:10:32

标签: sql performance sql-server-2016

我们说我有一个Account表和几个引用Account的表。

实际上是否存在性能差异:

DECLARE @accountIDs table (id int);

INSERT INTO @accountIDs 
    SELECT id 
    FROM Account

DELETE TableA 
WHERE accountFk IN (SELECT id FROM @accountIDs)

DELETE TableA  
WHERE accountFk IN (SELECT id FROM Account)

感谢。

2 个答案:

答案 0 :(得分:2)

当然!

声明的表变量需要相当多的开销才能创建和填充,并且不会有任何索引(遵循示例代码)。您可以使用索引创建您声明的表(Thx Gordon为您的提示!),但这只会增加更多的开销......

Account中的ID将被编入索引(可能/希望如此)。直接访问会更快 - 肯定!

此外,您需要一种程序方法来执行第一种方法。在视图或内联TVF中不允许声明表值变量。

答案 1 :(得分:1)

与任何有关性能的问题一样,您应该测试这两种方法。

在这两种情况下,性能很可能由删除主导,而不是记录的发现。表变量/临时表的一个优点是统计信息在创建时更准确。

您提供的查询建议您在(id)(accountFk)上需要两个单独的索引。使用这些索引,我发现使用临时表几乎没有优势。