2017-04-05 8 views
0

パフォーマンスを最適化するための以下のクエリを作成する方法はありますか?クエリの最適化、タイムアウトエラーがC#

INSERT INTO [dbo].[MBQ_All] ([Uniq], [StoreClass], [Store], [code], [ExtendedDescription], [ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS] 
      ,[Store+whMBQ]) 

    SELECT [Uniq], [StoreClass], [Store], [code], [ExtendedDescription], [ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS] 
      ,[Store+whMBQ] 
    FROM dbo.MBQ_All_1 
    WHERE MBQ_All_1.Uniq NOT IN (
      SELECT UNIQ 
      FROM dbo.MBQ_All 
      ); 

テーブルMBQ_All以上4,00,000行を有し、MBQ_All_1は2,00,000を有しています。

私はたぶん、EXI​​STS NOTを使用してみてくださいSQL Serverのに2008

+0

あなたはスキーマとEXPLAINを共有できますか? uniqにインデックスがありますか? –

+0

テーブルにクラスタ化されていないインデックスが1つあります。 – Developer

+0

uniqインデックスは存在しません。両方のテーブルのuniqカラムにインデックスを置くと、かなりの改善が得られます。 –

答えて

2

を使用しています:

INSERT INTO [dbo].[MBQ_All] ([Uniq], [StoreClass], [Store], [code], [ExtendedDescription], [ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS] 
     ,[Store+whMBQ]) 

SELECT [Uniq], [StoreClass], [Store], [code], [ExtendedDescription], 
[ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS] ,[Store+whMBQ] 
FROM dbo.MBQ_All_1 
WHERE NOT EXISTS (SELECT * 
       FROM dbo.MBQ_All 
       WHERE dbo.MBQ_All.UNIQ = MBQ_All_1.Uniq) 
+0

ありがとうございました、今は1分以上前にはわずか4秒しかかかりません – Developer

+0

心配する必要はありません。 – VDK

2

それはMERGE文のクリアケースです:オプションの

MERGE [dbo].[MBQ_All] Tgt 
USING [dbo].[MBQ_All_1] Src ON Tgt.Uniq = Src.Uniq 
WHEN NOT MATCHED THEN 
    INSERT ( [Uniq],  [StoreClass],  [Store],  [code],  [ExtendedDescription],  [ITEM_CLASS],  [SUPPLIER],  [Brands],  [Min],  [Max],  [ADS],  [Store+whMBQ]) 
    VALUES (Src.[Uniq], Src.[StoreClass], Src.[Store], Src.[code], Src.[ExtendedDescription], Src.[ITEM_CLASS], Src.[SUPPLIER], Src.[Brands], Src.[Min], Src.[Max], Src.[ADS], Src.[Store+whMBQ]); 
+0

うわー、これは新しく、ありがとうございます。 – Developer

1

一つは次のようになりLEFT JOINを持っていることがわかりますが、それが速いかどうかはわかりません:

INSERT INTO [dbo].[MBQ_All] 
    ([Uniq], [StoreClass], [Store], [code], [ExtendedDescription], [ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS]    ,[Store+whMBQ]) 

    SELECT [Uniq], [StoreClass], [Store], [code], [ExtendedDescription], [ITEM_CLASS], [SUPPLIER], [Brands], [Min], [Max],[ADS] 
      ,[Store+whMBQ] 
    FROM dbo.MBQ_All_1 mbqN 
    LEFT JOIN MBQ_All mbqO ON mbqN.Uniq = mbqO.Uniq 
    WHERE mbqO.Uniq IS NULL 
+0

それは私が書いた質問よりもまだ良いです、ありがとう! – Developer