2010-11-12 14 views
0

我一直有與SQL觸發器性能問題。該問題涉及在使用INSERTED觸發器表的select語句時執行SQL查詢。優化問題:複製觸發插入或刪除行到表變量

SELECT x FROM y WHERE x IN (SELECT x FROM INSERTED) 

查詢執行計劃指向(SELECT x FROM INSERTED)花費比預期的要長。我們在這裏談論x1000s行。

如果我創建一個表變量,而我選擇從插入到表變量中的行,然後用它的速度要快得多的「IN」子句中的表變量。

我的問題是,爲什麼是這樣快?我已經知道它可能是什麼。我讀過INSERTED表是一個虛擬表,它來自事務日誌,因此比使用表變量花費的時間要長得多。但是,我認爲將INSERTED表中的行選入表變量將會否定在'IN'子句中使用表變量的積極效果。

任何想法,爲什麼這是更快?

+0

對此深感抱歉,我會記住下一次! – jaffa 2010-11-14 15:37:17

回答

0

你不能只是嘗試定期JOININSERTED表?這些往往比那些子查詢執行顯著更好:

SELECT x 
FROM y 
INNER JOIN INSERTED i ON y.x = i.x 

不知道所有的細節,這是不可能確切地知道這是否會在所有幫助 - 但它是defintely值得一試!

+0

我實際上使用一個UPDATE語句在一個單獨的行上,當它的任何一個子表被更新時(它有1000行),這個語句用一個時間戳更新。爲什麼選擇插入到臨時表中的INSERTED行比在語句中直接使用它更快? – jaffa 2010-11-14 15:39:26