2013-07-02 56 views
3

我已經在MS SQL下面插入存儲過程:中的性能改善NOT IN插入

insert into Status_Table(Field1, Field2, Field3, Status_ID, Status_ID2) 
select a.Field1 , a.Field2 , a.Field3 , a.Status_ID , a.Status_ID2 
    from ##StatusTempTable as a 
    where a.Status_ID+a.Status_ID2 not in(select Status_ID+Status_ID2 from Status_Table) 

之前,我做的插入,我會檢查是否有任何行具有相同的STATUS_ID和Status_ID2存在。 Table Status_Table包含超過3個Mio行,Insert變得很長。有沒有其他方法可以提高性能?

回答

2

嘗試使用NOT EXISTS代替NOT IN

insert into Status_Table(Field1, Field2, Field3, Status_ID, Status_ID2) 
select a.Field1 , a.Field2 , a.Field3 , a.Status_ID , a.Status_ID2 
    from ##StatusTempTable as a 
    where not exists(select * from Status_Table s where s.Status_ID = a.Status_ID AND s.Status_ID2 = s.Status_ID2) 
0

在SQLServer2008的+也可以使用MERGE聲明

MERGE dbo.Status_Table AS target 
USING dbo.##StatusTempTable AS source 
ON (target.Status_ID = source.Status_ID AND target.Status_ID2 = source.Status_ID2) 
WHEN NOT MATCHED 
    THEN INSERT(Field1, Field2, Field3, Status_ID, Status_ID2) 
     VALUES(
       source.Field1, 
       source.Field2, 
       source.Field3, 
       source.Status_ID, 
       source.Status_ID2 
      );