Sql 合并导致太慢,如何优化此查询
如何优化此查询。我正在使用合并来提取插入的id 我已经看过执行计划了。这导致分拣成本增加 有没有其他方法可以代替使用合并来执行此操作。我试过按目标使用。还是很慢。我想了解这个合并语句Sql 合并导致太慢,如何优化此查询,sql,sql-server,Sql,Sql Server,如何优化此查询。我正在使用合并来提取插入的id 我已经看过执行计划了。这导致分拣成本增加 有没有其他方法可以代替使用合并来执行此操作。我试过按目标使用。还是很慢。我想了解这个合并语句 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
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;
可以将OUTPUT语句与insert一起使用。这当然比强制不匹配的合并要干净一些
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
可以将OUTPUT语句与insert一起使用。这当然比强制不匹配的合并要干净一些
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
这里的合并有什么意义?您对其进行了硬编码,使其永远不会与合并谓词匹配。为什么不简单地使用insert语句呢?@SeanLange也许是使用OUTPUT子句,但是yeah:我只需要insert/SELECT.Yes来输出id,我使用了merge。有没有其他方法可以在不合并的情况下对此进行优化。我在执行计划中看到,在合并语句和排序时会导致更多的开销。这里合并的意义是什么?您对其进行了硬编码,使其永远不会与合并谓词匹配。为什么不简单地使用insert语句呢?@SeanLange也许是使用OUTPUT子句,但是yeah:我只需要insert/SELECT.Yes来输出id,我使用了merge。有没有其他方法可以在不合并的情况下对此进行优化。我看到执行计划会导致合并语句和排序的开销增加。我没有看到SRC别名我的错,应该插入它。我是瞎编码的,太好了!。谢谢,如果部门ID不在inserting表中,但我们仍希望在output子句中包含该ID,该怎么办?如果未插入该ID,则必须使用硬编码值或变量。我看不到SRC别名“我的坏”,应该插入它。我是瞎编码的,太好了!。谢谢,如果部门ID不在inserting表中,但我们仍希望在output子句中包含该ID,该怎么办?如果未插入该ID,则必须使用硬编码值或变量。