提高表变量的删除性能

时间:2011-08-22 18:04:12

标签: tsql sql-delete table-variable

我已经看到t-sql中普通表的删除性能调整。

但是对表变量的删除是否有性能调整?


修改

这是一个例子: 由于UserExclusionsEvaluate实际上是CTE,因此情节变得更厚,但我将首先尝试围绕表变量进行优化(如果可能)。 CTE本身运行得非常快。只是删除很慢。

DELETE FROM @UsersCriteria
FROM @UsersCriteria UsersCriteria
WHERE UserId IN (SELECT UserID FROM UserExclusionsEvaluate WHERE PushRuleExclusionMet = 1)

在目前的版本中,@ UserCriteria是:

DECLARE @UsersCriteria TABLE
(
    UserId int primary key,
    PushRuleUserCriteriaType int
)

我已经尝试将@UsersCriteria作为非主要版本,并尝试使用群集非群集。

IN很可能也存在问题。我也在子查询上尝试过JOIN。


编辑:

好消息! 经过大量的SQL游戏,包括将suquery移动到链式CTE,尝试表提示等等。

从表变量到临时表的简单更改大大提高了性能。

这真的很有意思,因为删除运行正常,子查询(在CTE上)自行运行正常。但混合这两个跑得很慢。

我猜测在子查询中使用CTE时,优化器无法启动?也许当与删除混合时。

3 个答案:

答案 0 :(得分:4)

不是真的。

除非你在DECLARE中定义了一个可能工作的PK:没有表变量的统计信息,并假设该表只有1行

答案 1 :(得分:3)

你可以做的数量有限。但是,如果表变量中有大型数据集,则应该使用临时表,而不是需要更好的性能。

您也可以批量删除(例如每次1000次)。

否则,请告诉我们您的删除声明,我们会看到是否有任何可以改进的内容。

答案 2 :(得分:1)

否。

表变量是不可索引和瞬态的。他们没有统计数据。

它们不用于存储大量数据。

如果您有一个足够大的表变量,当您从中删除时会出现性能问题,那么您将以非预期的方式使用它们。将该数据放入#Temp表或真实表中,以便您拥有更多控制权。