1

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

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


编辑

这是一个示例:绘图变得更厚,因为 UserExclusionsEvaluate 实际上是一个 CTE,但我将首先尝试围绕表变量对其进行优化(如果可能的话)。CTE 本身运行速度非常快。只是删除速度很慢。

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

在当前的化身中,@UsersCriteria 是:

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

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

也有可能是IN的问题。我还尝试过对子查询进行 JOIN。


编辑:

好消息! 在大量使用 SQL 之后,包括将 suquery 移动到链式 CTE、尝试表提示等等等。

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

这真的很有趣,因为删除自己运行良好,子查询(在 CTE 上)自己运行良好。但是将两者混合起来非常缓慢。

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

4

3 回答 3

4

并不真地。

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

于 2011-08-22T18:09:12.153 回答
3

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

您也可以批量删除(比如一次 1000 个)。

否则,请向我们展示您的删除声明,我们将看看是否有任何可以改进的地方。

于 2011-08-22T18:10:54.470 回答
1

不。

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

它们不打算存储大量数据。

如果您有一个足够大的表变量,当您从中删除时会给您带来性能问题,那么您正在以一种意想不到的方式使用它们。将这些数据放入#Temp表格或真实表格中,以便您拥有更多控制权。

于 2011-08-22T18:10:27.847 回答