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

ストアド プロシージャは、Entity Framework を介して C# ライブラリから呼び出されます。

初めて実行されるとき (作成後) は、妥当な時間 (秒単位) で完了します。以降の実行 (C# アプリケーションまたは Management Studio から) には数分かかります。

ストアド プロシージャを (ALTER PROCEDUREコマンドを実行して) リセットし、Management Studio から同じパラメーター値を指定して呼び出すと、何度も何度もすばやく完了します。しかし、C# から呼び出されると、その後の実行は再び遅くなります。

このようなものを見た人はいますか?

4

0 に答える 0