1

これで髪を抜くことができます。WCFサービスとしてホストされるワークフローがあり、別のWCFサービスを呼び出して、ストアドプロシージャを呼び出します。ストアドプロシージャはマージを呼び出してから、別のsprocを呼び出すカーソルを繰り返し処理します。カーソル数は、マージのソース数と同じです。ソースカウントが高い場合(〜120k)、sprocは決して戻りません。ディスクアクティビティとCPU使用率はゼロであり、メモリは課税されていません。次にSSMSからsprocを呼び出すと、約1時間で完了します。

実際の呼び出しにはSQLDataAdapterを使用しています。SDAは、カーソルの反復ごとに更新を受信して​​失敗し、SQLが待機中にストールする原因になっていますか?それとも何か他のことが起こっていますか?

週の初めにワークフローの障害の原因を追跡するためにSDAを起動しましたが、ANSI警告メッセージが繰り返されてSDAに返され、メモリ不足の例外が発生したことが判明しました。それは、ここで何か他のことが起こっているのではないかと思い、問題を引き起こしています。

4

3 に答える 3

1

WCFホストが、データベース呼び出しを 1 時間保持するのに適切な環境であるかどうかを真剣に疑ってます。、および call により、HTTP 呼び出しが呼び出し元に返されます。

于 2010-08-13T00:30:59.677 に答える
0

パラメータ スニッフィングの非常に悪いケースであることが判明しました。非常に、非常に悪いケース...

于 2010-08-18T16:35:01.397 に答える
0

コードが実際に何をしているのかを伝えるのは難しいですが、ストアド プロシージャがカーソルを使用しており、ストアド プロシージャが遅いと述べています。一時テーブルを使用するようにストアド プロシージャを作成し、次の例に示すように一時テーブルを反復処理します。これにより、カーソルを使用したときに数分から数時間かかっていたプロシージャが、数秒から数分で実行されるようになりました。カーソルを使用していて、プロファイリングでストアド プロシージャのカーソル コードが遅いことが示されている場合は、一時テーブルを試してみてください。

カーソルに戻ることはありません。

-- create a temporary table
DECLARE @FrontDeskRows table (
    id int,
    Arrival datetime,
    Departure datetime,
    CheckedIn int,
    OwnerID varchar(50),
    GuestID varchar(50),
    [LName] varchar (256),
    [FName] varchar (256),
    [Address] varchar (256),
    [City] varchar (256),
    [State] varchar (256),
    [Zip] varchar (256),
    [phone] varchar (256),
    [Status] int )

-- load your temporary table
INSERT INTO @FrontDeskRows
  SELECT  id,
      Arrival,
      Departure,
      CheckedIn,
      OwnerID,
      GuestID,
      [LName],
      [FName],
      [Address],
      [City],
      [State],
      [Zip],
      [phone],
      [Status]
  FROM FrontDesk
  ORDER BY Id ASC

DECLARE @arrival as DateTime
DECLARE @departure as DateTime
DECLARE @id as int

-- loop over the temprary table
SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows)
SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id
SELECT @departure = Departure FROM @FrontDeskRows Where id = @id
  WHILE @id IS NOT NULL
   BEGIN

    -- PROCESS EACH ROW HERE

    -- get the next item in the temporary table
    SELECT @id = (SELECT MIN(id) FROM @FrontDeskRows WHERE id > @id)
    SELECT @arrival = Arrival FROM @FrontDeskRows Where id = @id
    SELECT @departure = Departure FROM @FrontDeskRows Where id = @id

   END
于 2010-08-13T03:35:25.337 に答える