我们有一个存储过程,它接受一个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# 调用,后续的执行就会再次变慢。
有人见过这样的吗?