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
ストアド プロシージャは、Entity Framework を介して C# ライブラリから呼び出されます。
初めて実行されるとき (作成後) は、妥当な時間 (秒単位) で完了します。以降の実行 (C# アプリケーションまたは Management Studio から) には数分かかります。
ストアド プロシージャを (ALTER PROCEDURE
コマンドを実行して) リセットし、Management Studio から同じパラメーター値を指定して呼び出すと、何度も何度もすばやく完了します。しかし、C# から呼び出されると、その後の実行は再び遅くなります。
このようなものを見た人はいますか?