2011-08-22 108 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我已經添加了一些更多的細節和示例。 –