2017-04-05 2 views
0

Gibt es eine bessere Möglichkeit, die folgende Abfrage für die Optimierung der Leistung zu schreiben.Anfrage Optimierung, Timeout-Fehler in 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 
      ); 

Die Tabelle MBQ_All hat mehr als 4,00,000 Zeilen und MBQ_All_1 2,00,000 hat.

Ich bin mit SQL Server 2008.

+0

können Sie bitte ein Schema und ein EXPLAIN teilen? Gibt es einen Index zu uniq? –

+0

Es gibt einen nicht geclusterten Index in der Tabelle, es existiert kein uniq-Index. – Developer

+0

Sie werden mit ziemlicher Sicherheit eine signifikante Verbesserung erhalten, wenn Sie einen Index auf die uniq-Spalte in beiden Tabellen setzen. –

Antwort

2

Vielleicht VORHANDEN mit Versuchen Sie NICHT:

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

Vielen Dank, jetzt dauert es nur 4 Sekunden, bevor es mehr als 1 Minute war – Developer

+0

Keine Sorge, froh, ich könnte helfen :) – VDK

2

Es ist ein klarer Fall für MERGE Aussage:

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

wow, das ist neu für mich, vielen Dank – Developer

1

Eine der Optionen wäre LINKS ZU VERBINDEN, aber ich bin mir nicht sicher, ob es schneller sein wird:

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

Es ist immer noch besser als die Frage, die ich geschrieben habe, danke! – Developer