2012-07-20 58 views
0

我有以下SQL查詢,並且需要很長時間才能完成。我想檢查是否可以使用不同的查詢來獲得相同的結果,但也可能有助於提高性能。性能優化 - MS SQL使用NOT IN的刪除查詢caluse

Delete from table1 WHERE fk_id = '1234' AND pk_id NOT IN ('aaaa', 'bbbb', 'cccc'); 

注:pk_idPK列,fk_idtable1一個FK。

+3

有多少行必須刪除?並且請接受一些答案,以便更多人希望幫助您 – 2012-07-20 18:12:39

+3

請提供更多信息。桌子有多大?你有約束嗎?觸發器?級聯刪除? – 2012-07-20 18:12:45

+1

有一件事,當你問問人們對你的系統和表格什麼都不知道的問題時。因此,在發佈時儘可能多地發佈關於查詢中表格的元數據信息。像表格的大小,表格的ddl,所有的索引等。這將使其他人更快地幫助你。 – 2012-07-20 18:36:29

回答

0

我對查詢沒有任何建議,它非常基本。

但你可能想嘗試添加索引:

ALTER TABLE table1 ADD INDEX (fk_id); 
+0

另外,正如@Gordon Linoff評論你的問題,刪除查詢受觸發器,約束和級聯刪除的影響。這可能是讓它如此緩慢的原因。 – Scen 2012-07-20 18:14:50

0

與您所提供的數據,似乎你已經使用「AND」條件要與您的查詢沒有問題。現在你需要考慮和分析你的數據庫,爲什麼你的查詢花費了很多時間。所以你可能想看看下面的東西。

1)SELECT COUNT(1)
從表1
其中fk_id = '1234' AND pk_id NOT IN( 'AAAA', 'BBBB', 'CCCC')
這會給你的行數被刪除。

2)嘗試像
選擇
T.name AS表名 ,O.name TriggerName
FROM系統對象ö
INNER JOIN SYS.TABLES T ON T.object_id = O.parent_obj
其中o .type ='TR'AND T.name ='table1'

這會告訴你與你的表相關的觸發器。

3)您需要進一步調查索引的表屬性,任何約束在那裏。