Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并导致太慢,如何优化此查询_Sql_Sql Server - Fatal编程技术网

Sql 合并导致太慢,如何优化此查询

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

如何优化此查询。我正在使用合并来提取插入的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, 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,则必须使用硬编码值或变量。