0

我们有一个存储过程,它接受一个XML非常大的参数。

CREATE PROCEDURE [dbo].[GetAllocationsOver100]
      @PartID int,   
      @Details xml
AS
BEGIN
      SET NOCOUNT ON;

      DECLARE @MemoryRecords TABLE (
            PartID int, AppId int, LocGuid uniqueidentifier, [Date] datetime, Level int
      )     

      INSERT INTO @MemoryRecords (PartID, AppId, LocGuid, [Date], Level)
            SELECT 
                  PartID = T.Item.value('@PartID[1]', 'int'),
                  AppId  = T.Item.value('@AppId[1]', 'int'),
                  LocGuid  = T.Item.value('@LocGuid[1]', 'uniqueidentifier'),
                  [Date] = T.Item.value('@Date[1]', 'datetime'),
                  Level  = T.Item.value('@Level[1]', 'int')
            FROM 
                  @Details.nodes('/parts/part') AS T(Item);

      WITH 
            Unitedpart as
            (
                  SELECT * FROM @MemoryRecords
                  UNION ALL
                  SELECT * FROM dbo.udf_GetAllPartsExcludingOne(@PartID)
            ),

            Aggregatedpart as
            (
                  SELECT 
                        AppId, LocGuid, [Date], SUM(Level) AS Aggregated
                  FROM 
                        Unitedpart
                  GROUP BY 
                        AppId, LocGuid, [Date] 
            )

      SELECT 
            DISTINCT(S.PartID)
      FROM 
            Aggregatedpart AGS
            JOIN dbo.udf_GetAllPartsExcludingOne(@PartID) S
                  ON AGS.AppId = S.AppId
      WHERE 
            AGS.Aggregated > 100
END

存储过程通过实体框架从 C# 库中调用。

第一次执行时(在创建之后),它会在合理的时间(以秒为单位)内完成。任何后续执行(从 C# 应用程序或通过 Management Studio)都需要几分钟时间。

如果我们重置存储过程(通过执行ALTER PROCEDURE命令),然后使用 Management Studio 中的相同参数值调用它,它会一遍又一遍地快速完成。但是一旦从 C# 调用,后续的执行就会再次变慢。

有人见过这样的吗?

4

0 回答 0