我有以下SQL查詢,並且需要很長時間才能完成。我想檢查是否可以使用不同的查詢來獲得相同的結果,但也可能有助於提高性能。性能優化 - MS SQL使用NOT IN的刪除查詢caluse
Delete from table1 WHERE fk_id = '1234' AND pk_id NOT IN ('aaaa', 'bbbb', 'cccc');
注:pk_id
是PK
列,fk_id
是table1
一個FK。
我有以下SQL查詢,並且需要很長時間才能完成。我想檢查是否可以使用不同的查詢來獲得相同的結果,但也可能有助於提高性能。性能優化 - MS SQL使用NOT IN的刪除查詢caluse
Delete from table1 WHERE fk_id = '1234' AND pk_id NOT IN ('aaaa', 'bbbb', 'cccc');
注:pk_id
是PK
列,fk_id
是table1
一個FK。
我對查詢沒有任何建議,它非常基本。
但你可能想嘗試添加索引:
ALTER TABLE table1 ADD INDEX (fk_id);
另外,正如@Gordon Linoff評論你的問題,刪除查詢受觸發器,約束和級聯刪除的影響。這可能是讓它如此緩慢的原因。 – Scen 2012-07-20 18:14:50
與您所提供的數據,似乎你已經使用「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)您需要進一步調查索引的表屬性,任何約束在那裏。
有多少行必須刪除?並且請接受一些答案,以便更多人希望幫助您 – 2012-07-20 18:12:39
請提供更多信息。桌子有多大?你有約束嗎?觸發器?級聯刪除? – 2012-07-20 18:12:45
有一件事,當你問問人們對你的系統和表格什麼都不知道的問題時。因此,在發佈時儘可能多地發佈關於查詢中表格的元數據信息。像表格的大小,表格的ddl,所有的索引等。這將使其他人更快地幫助你。 – 2012-07-20 18:36:29