2011-08-22 48 views
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时,优化器无法启动?也许当与删除混合。

+0

你有PushRuleExclusionMet索引(假设用户ID是集群) – gbn

+0

嗨@gbn谢谢你为我调查这个。 PushRuleExclusionMet在CTE中? CTE中的列可以被索引吗? –

+0

对不起,错过了那个位 – gbn

回答

4

不是。

除非你在DECLARE定义的PK,其可能工作:对于表变量没有统计数据和假设表有1行只有

+0

+1 - 我不知道你可以在声明中分配一个PK。 – JNK

+0

@JNK:PRIMARY KEY和UNIQUE http://msdn.microsoft.com/en-us/library/ms188927.aspx – gbn

+0

谢谢@gbn,我已经给出了一个镜头。我有一种感觉,它不仅仅是我的表格变量,而且还有我正在进行的所有其他gubbins。我添加了一个实例。 –

1

NO。

表变量是无法索引和暂时的。他们没有统计数据。

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

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

+0

我可能会给普通表一个镜头。谢谢。我已经添加了一些更详细的示例。 –

+0

嗨@JNK好消息看起来像一个临时表做了伎俩。谢谢你的帮助。 –

+0

@亚历克斯很高兴听到它解决。 – JNK

3

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

你也可以批量删除(一次说1000个)。

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

+0

批处理删除真的会帮助堆? – JNK

+0

不知道,从来没有尝试过它可能不是。除非他目前正在光标中删除一条记录。那么一批所有的记录肯定会更快。 – HLGEM

+0

谢谢@HLGEM我已经添加了一些更多的细节和示例。 –