2017-06-26 4 views
0

このクエリを最適化する方法を教えてください。私は挿入されたIDを引き出すためにマージを使用していますMergeが遅すぎるため、このクエリを最適化する方法

実行計画を見ました。それは並べ替えに多くのコストを引き起こしていました。

マージを使用する代わりにこれを行う他の方法はありますか。私はBY TARGETを使ってみました。まだ遅いです。私はこのマージステートメントに乗りたいです。

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

とにかくここでマージのポイントは何ですか?マージ述部と決してマッチしないようにハードコーディングしました。単純に挿入文を使用しないのはなぜですか? –

+0

@SeanLangeおそらく、OUTPUT句を使用することが考えられますが、私はちょうどINSERT/SELECTを使用します。 –

+0

ouput idのはい私はマージを使用しました。マージなしでこれを最適化する他の方法はありますか?私は実行計画で、マージステートメントと並べ替えでより多くのコストが発生するのを見た。 – Kiran

答えて

1

挿入時にOUTPUT文を使用できます。 https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sqlこれは強制的にマッチしないマージよりも確かに少しクリーナーです。

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

SRCエイリアスが表示されません – Kiran

+0

私は悪いです、それはINSERTEDする必要があります。ここでは盲目的にコーディングしていた –

+0

素晴らしい!ありがとうございました – Kiran

関連する問題