从C#(EF)调用后,带有XML参数的SQL Server存储过程需要更长的时间

时间:2013-01-30 16:30:42

标签: sql sql-server xml stored-procedures

我们有一个存储过程,它带有一个非常大的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#调用,随后的执行就会再次减速。

有人见过这样的事吗?

0 个答案:

没有答案