3

MS SQL ストアド プロシージャに次の挿入があります。

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 を持つ行が存在するかどうかを確認します。テーブル Status_Table には 3 Mio を超える行が含まれており、挿入が非常に長くなっています。パフォーマンスを向上させる代替手段はありますか?

4

2 に答える 2

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 )
于 2013-07-02T06:36:14.910 に答える
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
              );
于 2013-07-02T14:21:33.370 に答える