2017-06-26 2 views
0

Wie kann ich diese Abfrage optimieren. Ich benutze Merge, um eingefügte IDsMerge Ursachen zu langsam, wie diese Abfrage zu optimieren

ziehen Ich habe auf Ausführungsplan geschaut. Das verursachte mehr Kosten.

Gibt es eine andere Möglichkeit, dies zu tun, anstatt Merge zu verwenden. Ich habe versucht, BY TARGET zu verwenden. Immer noch langsam. Ich möchte von dieser Zusammenführungsaussage reiten.

DECLARE @TEMP_STUDENT_DETAILS_ID AS TABLE (STUDENT_DETAILS_ID INT, SCHOOL_ID INT) 

MERGE INTO DBO.STUDENT_DETAILS USING (
SELECT ISNULL(SUM(MARKS),0) AS MARKS, SCHOOL_ID 
FROM DBO.OLD_STUDENT_DETAILS 
WHERE SCHOOL_ID IS NOT NULL 
GROUP BY SCHOOL_ID) SRC ON 1 = 0 
WHEN NOT MATCHED BY TARGET THEN 
INSERT (MARKS 
     ,SCHOOL_ID 
     ,CODE_ID 
     ,CODE_VALUE 
     ,CREATED_BY 
     ,CREATED_DATE 
     ,MODIFIED_BY 
     ,MODIFIED_DATE) 
VALUES (SRC.MARKS 
     ,SRC.SCHOOL_ID 
     ,101 --CODE_ID 
     ,'ADA' --CODE_VALUE 
     ,'Admin' 
     ,GETDATE() 
     ,'Admin' 
     ,GETDATE()) 
OUTPUT INSERTED.STUDENT_DETAILS_ID, SRC.SCHOOL_ID INTO @TEMP_STUDENT_DETAILS_ID; 
+1

Was ist der Sinn der Zusammenführung hier sowieso? Sie haben es hart codiert, nie mit dem Zusammenführungsprädikat übereinzustimmen. Warum nicht einfach eine Insert-Anweisung verwenden ??? –

+0

@SeanLange Vielleicht ist die Idee, die OUTPUT-Klausel zu verwenden, aber ja: Ich würde nur INSERT/SELECT. –

+0

Ja, um die IDs auszugeben, habe ich Merge verwendet. Gibt es eine andere Möglichkeit, dies ohne Zusammenführung zu optimieren? Ich sah am Ausführungsplan verursacht mehr Kosten bei Merge-Anweisungen und sortieren. – Kiran

Antwort

1

Sie können die OUTPUT-Anweisung mit einer Einfügung verwenden. https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql Dies ist sicherlich ein bisschen sauberer als eine Zusammenführung mit einem erzwungenen nicht übereinstimmen.

INSERT DBO.STUDENT_DETAILS 
( MARKS 
    ,SCHOOL_ID 
    ,CODE_ID 
    ,CODE_VALUE 
    ,CREATED_BY 
    ,CREATED_DATE 
    ,MODIFIED_BY 
    ,MODIFIED_DATE 
) 
OUTPUT INSERTED.STUDENT_DETAILS_ID, INSERTED.SCHOOL_ID INTO @TEMP_STUDENT_DETAILS_ID 
SELECT ISNULL(SUM(MARKS),0) AS MARKS 
    , SCHOOL_ID 
    ,101 --CODE_ID 
    ,'ADA' --CODE_VALUE 
    ,'Admin' 
    ,GETDATE() 
    ,'Admin' 
    ,GETDATE() 
FROM DBO.OLD_STUDENT_DETAILS 
WHERE SCHOOL_ID IS NOT NULL 
GROUP BY SCHOOL_ID 
+0

Ich sehe nicht SRC-Alias ​​ – Kiran

+0

Mein schlechtes, es sollte INSERTED sein. Ich habe hier blind gecodiert. –

+0

Großartig !. Danke – Kiran