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