我们说我有一个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)
感谢。
答案 0 :(得分:2)
当然!
声明的表变量需要相当多的开销才能创建和填充,并且不会有任何索引(遵循示例代码)。您可以使用索引创建您声明的表(Thx Gordon为您的提示!),但这只会增加更多的开销......
表Account
中的ID将被编入索引(可能/希望如此)。直接访问会更快 - 肯定!
此外,您需要一种程序方法来执行第一种方法。在视图或内联TVF中不允许声明表值变量。
答案 1 :(得分:1)
与任何有关性能的问题一样,您应该测试这两种方法。
在这两种情况下,性能很可能由删除主导,而不是记录的发现。表变量/临时表的一个优点是统计信息在创建时更准确。
您提供的查询建议您在(id)
和(accountFk)
上需要两个单独的索引。使用这些索引,我发现使用临时表几乎没有优势。