我已经看到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时,优化器无法启动?也许当与删除混合时。
答案 0 :(得分:4)
不是真的。
除非你在DECLARE中定义了一个可能工作的PK:没有表变量的统计信息,并假设该表只有1行
答案 1 :(得分:3)
你可以做的数量有限。但是,如果表变量中有大型数据集,则应该使用临时表,而不是需要更好的性能。
您也可以批量删除(例如每次1000次)。
否则,请告诉我们您的删除声明,我们会看到是否有任何可以改进的内容。
答案 2 :(得分:1)
否。
表变量是不可索引和瞬态的。他们没有统计数据。
它们不用于存储大量数据。
如果您有一个足够大的表变量,当您从中删除时会出现性能问题,那么您将以非预期的方式使用它们。将该数据放入#Temp
表或真实表中,以便您拥有更多控制权。